poj2421
2015-07-22 20:51
295 查看
题目大意:有n个村庄,要求把n个村庄连接在一起的最短距离
解题思路:kruskal算法即可,注意就是有点村庄已经连载一起了,把邻接矩阵的距离变为0就行了
解题思路:kruskal算法即可,注意就是有点村庄已经连载一起了,把邻接矩阵的距离变为0就行了
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const int maxs=100+10; const int maxn=100*50+100; int G[maxs][maxs]; int u[maxn],v[maxn],w[maxn],p[maxn],r[maxn],n,m;//数组u储存起始点,数组v存储终点,数组w存储边权,m是边数,n是点数 int cmp(const int i,const int j) {return w[i]<w[j];} int find(int x) {return p[x]==x?x:p[x]=find(p[x]);} int kruskal() { int cou=0,x,y,i,ans=0; for(i=1;i<=n;i++) p[i]=i;//初始化并查集 for(i=1;i<=m;i++) r[i]=i; sort(r+1,r+m+1,cmp);//根据边权排序 for(i=1;i<=m;i++) { int e=r[i];x=find(u[e]);y=find(v[e]); if(x!=y) {ans += w[e];p[x]=y;cou++;} if(cou==n-1) {return ans;} } if(cou<n-1) ans=0;//n个点的数有n条边 return ans; } int main() { while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&G[i][j]); int q; scanf("%d",&q); for(int i=1;i<=q;i++) { int x,y; scanf("%d%d",&x,&y); G[x][y]=0; G[y][x]=0; } m=0; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) { m++; u[m]=i; v[m]=j; w[m]=G[i][j]; } printf("%d\n",kruskal()); } return 0; }
相关文章推荐
- 线程状态流转图
- 谁是最大的竞争对手互联网宝宝军团?
- hdu 1878 欧拉回路
- 循环结构小例子(1)
- HDU_2594 Simpsons’ Hidden Talents
- NYOJ 35 表达式求值
- 什么是系统的抖动,它有什么危害?
- hdu1998 奇数阶魔法 (数组填数)
- [leedcode 115] Distinct Subsequences
- Java对象生命周期
- Java各种Synchronizer: CountDownLatch, CyclicBarrier,Semaphore
- Java图形界面编程生成exe文件
- Java图形界面编程生成exe文件
- 挑剔的小杜
- Teamcenter WorkFlow(二)
- [Android&Java]浅谈设计模式-代码篇:观察者模式Observer
- 第一次写博客,为自己学习apue的每一步做好记录
- poj 2762 Going from u to v or from v to u?
- 【树结构】SPOJ QTREE2
- hd2137