hdu 1863 畅通工程(prim+kruskal)
2015-11-24 01:01
399 查看
题目链接:hdu 1863 畅通工程(prim+kruskal)
1.prim朴素+邻接矩阵建图
2.kruskal
1.prim朴素+邻接矩阵建图
#include<iostream> #include<cstdio> #include<cstring> #define maxn 111 #define inf 1<<31-1 using namespace std; int n,m,ans; int vis[maxn],mapp[maxn][maxn],dis[maxn];//dis记录未被加入集合的点到集合的最短距离 void prim() { fill(vis,vis+maxn,0); for(int i=1;i<=m;i++) dis[i]=mapp[1][i];//随便选择一个点,这里选择第一个点,dis记录所有点到这个点的距离 dis[1]=0;//自己到自己距离为0 vis[1]=1;//标记为访问过 for(int i=1;i<m;i++)//第一个点已经加入集合,还有m-1个点 { int Min=inf,k; for(int j=1;j<=m;j++) if(!vis[j]&&Min>dis[j]) Min=dis[j],k=j;//选择到集合距离最短的点,更新最短距离并记录该点 if(Min==inf){ans=-1;return;}//Min为无穷大表明没有与该图连通的点,也就是说这个图不是完全图 ans+=Min; vis[k]=1;//将与该集合距离最短的点标记为访问过 for(int j=0;j<=m;j++) if(!vis[j]&&dis[j]>mapp[k][j]) dis[j]=mapp[k][j];//更新所有与该集合的最近距离 } } void init()//初始将所有边权值赋为正无穷大 { for(int i=1;i<=m;i++) for(int j=1;j<=m;j++) mapp[i][j]=inf; } int main() { int a,b,c; while(cin>>n>>m&&n) { init(); while(n--){ cin>>a>>b>>c;mapp[a][b]=mapp[b][a]=c;}//无向图输入权值 ans=0; prim(); if(ans==-1){ cout<<'?'<<endl;continue;} cout<<ans<<endl; } }
2.kruskal
#include<iostream> #include<algorithm> #include<cstdio> #define maxn 111 using namespace std; int father[maxn]; struct node { int l,r; int value; }; int Find(int x) { if(father[x]!=x) father[x]=Find(father[x]); return father[x]; } int Merge(int x,int y) { x=Find(x); y=Find(y); if(x!=y) father[x]=y; } bool same(int x,int y) { return Find(x)==Find(y) ? 1:0; } bool rule(node x,node y) { return x.value<y.value; } int main() { int n,m; node a[maxn]; while(cin>>m>>n&&m) { for(int i=1;i<=n;i++) father[i]=i; for(int i=1;i<=m;i++) cin>>a[i].l>>a[i].r>>a[i].value; sort(a+1,a+n+1,rule); int ans=0; for(int i=1;i<=m;i++) { if(!same(a[i].l,a[i].r)) { Merge(a[i].l,a[i].r); ans+=a[i].value; } } int sum = 0; for(int i=1;i<=n;i++) if(father[i]==i) sum++; if(sum==1) cout<<ans<<endl; else cout<<'?'<<endl; } return 0; }
相关文章推荐
- Unix网络编程---第一次作业
- 删除排序数组中的重复数字 II
- 团队作业M1反思
- MyEclipse插件不能安装原因
- MySQL存储过程 事务transaction
- JAVA笔记二
- Java多线程开发系列之番外篇:事件派发线程---EventDispatchThread
- JAVA笔记一环境变量配置
- *LeetCode-Meeting Rooms II
- nagios安装学习一
- vbox下安装arch
- python入门(4)
- html的select控件的option选中事件
- Unix操作系统内核结构报告
- Android Sqlite+反射 实现CRUD
- Android studio 自定义多选框CheckBox
- MyBatis开发-->入门
- Android4.0-Fragment框架实现方式剖析(一)
- 万能的Volley
- MySQL存储过程 游标循环的使用