题解报告:hdu 1863 畅通工程
#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 畅通工程的更多相关文章
- hdu 1863 畅通工程 (并查集+最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others) M ...
- <hdu - 1863> 畅通工程 并查集和最小生成树问题
本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 Problem Description: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以 ...
- hdu 1863 - 畅通工程(MST)
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 1863 畅通工程
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...
- HDU 1863 畅通工程(Prim算法求解MST)
题目: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本.现 ...
- HDU 1863 畅通工程 克鲁斯卡尔算法
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 1863 畅通工程(Kruskal)
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU 1863 畅通工程(Prim,Kruskal,邻接表模板)
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 1863 畅通工程 -Kruskal模版
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
随机推荐
- 什么是restful
- SGU - 321 - The Spy Network
先上题目: 321. The Spy Network Time limit per test: 0.5 second(s)Memory limit: 65536 kilobytes input: st ...
- 爬虫——使用ItemLoader维护item
在item的Filed()中设置参数函数,可以用来预处理item字段的数据,另一方面也方便程序代码的管理和重用 item中 from scrapy.loader.processors import M ...
- 【整理】uclibc,eglibc,glibc之间的区别和联系
http://www.crifan.com/relation_between_uclibc_glibc_eglibc/ 1.Glibc glibc = GNU C Library 是GNU项(GNU ...
- html+css使图片在页面中循环滚动
我们先通过html创建一个div盒子的框架,方便后续以及实际使用中调整位置. <!DOCTYPE html> <html> <head> <meta char ...
- 《Linux内核分析》MOOC课程
http://www.cnblogs.com/wickedpriest/p/4315189.html
- 内核信号处理 & CPU8个通用寄存器
内核信号处理参考: http://www.spongeliu.com/165.html 信号本质上是在软件层次上对中断机制的一种模拟(注意区分中断.异常.信号),其主要有以下几种来源: 程序错误:除零 ...
- lua中的闭包小结
function newCounter() return function() i=i+ return i end end c1=newCounter() print(c1()) print(c1() ...
- 【python】蛋疼的中文乱码解决方案
转自: http://yooooo.us/2013/python-encoding-decoding?variant=zh-cn
- 使用DBMS_REDEFINITION在线切换普通表到分区表
随着数据库数据量的不断增长,有些表须要由普通的堆表转换为分区表的模式.有几种不同的方法来对此进行操作.诸如导出表数据,然后创建分区表再导入数据到分区表.使用EXCHANGE PARTITION方式来转 ...