Problem C
Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 13 Accepted Submission(s) : 4
4 2 1 3 4 3 3 3 1 2 1 3 2 3 5 2 1 2 3 5 999 0 0
1 0 2 998 <div style='font-family:Times New Roman;font-size:14px;background-color:F4FBFF;border:#B7CBFF 1px dashed;padding:6px'><div style='font-family:Arial;font-weight:bold;color:#7CA9ED;border-bottom:#B7CBFF 1px dashed'><i>Hint</i></div>Hint</div>Huge input, scanf is recommended.
关于 最短联通路线的问题 并查集
把他分成几个 并集
比如
这个图片!!
就差一个 联通路
就是找几个 并集
具体 代码实现如下
主要是
while(x!=bin【x】)
x=bin【x】;
#include<stdio.h> #include<iostream> using namespace std; int bin[1002]; int findx(int x) { int r=x; while(bin[r]!=r) r=bin[r]; return r; } void merge(int x,int y) { int fx,fy; fx = findx(x); fy = findx(y); if(fx != fy) bin[fx]=fy; } int main() { int n,m,i,x,y,sum; while(cin>>n&&n!=0) { for(i=1;i<=n;i++) bin[i] = i; cin>>m; for(;m>0;m--) { cin>>x>>y; merge(x,y); } sum=-1; for(i=1;i<=n;i++) if(bin[i]==i) sum++; printf("%d\n",sum); } }