标签:
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 22048 | Accepted: 9389 |
Description
Input
Output
Sample Input
3 0 990 692 990 0 179 692 179 0 1 1 2
Sample Output
179
Source
题解:
有n个村庄,编号为1 ,2 ,3 ,,,n 应该建造道路使他们互相可达
对输入数据
3
0 990 692
990 0 179
692 179 0
1
1 2
意思有3个村庄,
0 990 692
990 0 179
692 179 0
意思是1号到1,2,3的距离分别为0 990 692
1
1 2
意思是有一条道路已经接通,就是1号与2号间的道路
#include<cstdio> #include<algorithm> #include<iostream> using namespace std; #define N 110 struct node{ int x,y,v; }e[N*(N+1)]; int n,m,k,tot,cnt,fa[N]; bool cmp(const node &a,const node &b){ return a.v<b.v; } int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]); } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ int x; scanf("%d",&x); if(x){ e[++cnt].x=i;e[cnt].y=j;e[cnt].v=x; } } } scanf("%d",&m); for(int i=1;i<=m;i++){ int x,y; scanf("%d%d",&x,&y); int fx=find(x),fy=find(y); if(fx!=fy) fa[fy]=fx; } sort(e+1,e+cnt+1,cmp); for(int i=1;i<=cnt;i++){ int fx=find(e[i].x),fy=find(e[i].y); if(fx!=fy){ fa[fy]=fx; tot+=e[i].v; k++; } //if(k==n-m-1) break;不能这样写(并查集原理理解错了) if(k==n-1) break;//是mst,这里就不能改 } printf("%d\n",tot); return 0; }
标签:
原文地址:http://www.cnblogs.com/shenben/p/5630387.html