Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
Output
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
Sample Input
3 3
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100
Sample Output
3
?
解题思路:全省畅通也就是求最小生成树,如果给出的数据不全,得到的将是INF,此时输出'?',否则输出对应的最小代价。
AC代码之Prim算法:
 #include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
int m,n,a,b,c,mincost[],cost[][];
bool vis[];
void Prim(){
for(int i=;i<=n;++i)
mincost[i]=cost[][i];
mincost[]=;vis[]=true;
int res=;
for(int i=;i<n;++i){//m-1个节点
int k=-;
for(int j=;j<=n;++j)//这里更新一下获得的新发现,循环到第二次时会默认地把mincost[2]当作最小值,然后与剩下的元素比较,找到最小
if(!vis[j] && (k==-||mincost[k]>mincost[j]))k=j;
if(k==-)break;
if(mincost[k]==INF)break;//如果此时的最小值还是INF,说明统计数据不足,直接退出
vis[k]=true;
res+=mincost[k];
for(int j=;j<=n;++j)
if(!vis[j])mincost[j]=min(mincost[j],cost[k][j]);
}
bool flag=false;//标记是否还有未访问
for(int i=;i<=n;++i)
if(!vis[i]){flag=true;break;}//如果还有未被访问,说明统计数据不全,输出'?'
if(flag)cout<<'?'<<endl;
else cout<<res<<endl;
}
int main()
{
while(cin>>m>>n && m){
memset(vis,false,sizeof(vis));
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
cost[i][j]=(i==j?:INF);
for(int i=;i<=m;++i){
cin>>a>>b>>c;
cost[a][b]=cost[b][a]=c;
}
Prim();
}
return ;
}

AC之Kruskal算法(并查集):判断数据不全的依据是如果所有节点的根节点不一样,即不在同一个集合时输出'?',否则输出最小代价即可。

 #include<bits/stdc++.h>
using namespace std;
int m,n,father[],sum;
struct edge{int u,v,cost;}es[];//可能有n*(n-1)/2条边,因为这是无向有权图,此时开5000长度已经够了
bool cmp(const edge& e1,const edge& e2){//引用,减少拷贝所花时间
return e1.cost<e2.cost;
}
void init_union_find(){//将每个节点当作根节点
for(int i=;i<=n;++i)father[i]=i;
}
int find_father(int x){//递归查找根节点
if(father[x]==x)return x;
else return father[x]=find_father(father[x]);
}
void unite(int x,int y,int z){
x=find_father(x);
y=find_father(y);
if(x!=y){//如果边的两端点的根节点不相同,即分别为非连通图,则可以归并
sum+=z;//加上最小权值
father[x]=y;
}
}
int main()
{
while(cin>>m>>n && m){
for(int i=;i<=m;++i)
scanf("%d %d %d",&es[i].u,&es[i].v,&es[i].cost);
sort(es+,es+m+,cmp);//权值按从小到大排序
sum=;init_union_find();//初始化
for(int i=;i<=m;++i)
unite(es[i].u,es[i].v,es[i].cost);
bool flag=false;
for(int i=;i<=n;++i)//判断是否在同一个集合中
if(find_father()!=find_father(i)){flag=true;break;}
if(flag)cout<<'?'<<endl;
else printf("%d\n",sum);
}
return ;
}

题解报告:hdu 1863 畅通工程的更多相关文章

  1. hdu 1863 畅通工程 (并查集+最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    M ...

  2. <hdu - 1863> 畅通工程 并查集和最小生成树问题

    本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863  Problem Description: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以 ...

  3. hdu 1863 - 畅通工程(MST)

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. HDU 1863 畅通工程

    畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  5. HDU 1863 畅通工程(Prim算法求解MST)

    题目: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本.现 ...

  6. HDU 1863 畅通工程 克鲁斯卡尔算法

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. HDU 1863 畅通工程(Kruskal)

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  8. HDU 1863 畅通工程(Prim,Kruskal,邻接表模板)

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. HDU 1863 畅通工程 -Kruskal模版

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

随机推荐

  1. Python-文件和数据格式化

    文件的使用 >文件的类型 文件的理解:文件是数据的抽象和集合 -文件时存储在辅助存储器上的数据序列 -文件是数据存储的一种形式 -文件展现形态:文本文件和二进制文件 文本文件vs.二进制文件 - ...

  2. 运用循环求和( sum operation in python)

    1.for loop example 1: sum of 1+2+...+10 ********** >>> sum=0 >>> for x in [1,2,3,4 ...

  3. SpringSecurity 获取认证信息 和 认证实现

    JdbcDaoImpl 实现获取认证信息 PasswordEncoder 实现具体认证过程

  4. 【Codeforces 1034A】Enlarge GCD

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 设原来n个数字的gcd为g 减少某些数字之后 新的gcd肯定是g的倍数 即gx 我们可以枚举这个x值(x>=2) 看看原来的数字里面有多 ...

  5. empty array & Array.from

    empty array bug const duplicationArray = (arr = [], times = 2, debug = false) => { let result = [ ...

  6. HDU 1159 LCS最长公共子序列

    #include <cstdio> #include <cstring> using namespace std; ; #define max(a,b) a>b?a:b ...

  7. oracle中的类似BIN$MrkCYT9eTTK+0sStMwn7+Q==$0的表的作用

    https://www.2cto.com/database/201211/166482.html https://docs.oracle.com/cd/E11882_01/server.112/e40 ...

  8. - > 动规讲解基础讲解三——混合背包(背包模板)

    将01背包,完全背包,和多重完全背包问题结合起来,那么就是混合三种背的问题 根据三种背包的思想,那么可以得到混合三种背包的问题可以这样子求解 for(int i=1; i<=N; ++i) if ...

  9. ArcGIS 10.1 for Server安装教程系列—— Linux下的单机安装

    http://www.oschina.net/question/565065_81231      因为Linux具有稳定,功能强大等特性,因此常常被用来做为企业内部的服务器,我们的很多用户也是将Ar ...

  10. Spring MVC JSON自己定义类型转换(续)

    前面提到了两种转换类型的方法(Spring MVC JSON自己定义类型转换),这里针对Json转换提供一种更简便的方法. 通过配置全局的日期转换来避免使用麻烦的注解. 首先用到了一个简单的日期工具类 ...