没啥说的,最简单的并查集模型了,什么多余的工作都不用做,没有节点信息需要你更新。 代码如下: 另外,还是因为一个巨白痴的错误WA了很多次,哭啊。。。 #include <iostream> using namespace std; struct { int parent; }student[50005]; void MakeSet(int SizeOfInt) { for (int i = 1;i <= SizeOfInt;i++) student[i].parent=i; } void Union(int RootOfX,int RootOfY,int NodeX,int NodeY) { student[RootOfY].parent = RootOfX; } int Find(int NodeToFind) { if(student[NodeToFind].parent==NodeToFind) return NodeToFind; student[NodeToFind].parent = Find(student[NodeToFind].parent); return student[NodeToFind].parent; } int main() { int Case = 1; int NumOfStudents,NumOfPairs; while (cin>>NumOfStudents>>NumOfPairs&&NumOfStudents!=0) { MakeSet(NumOfStudents+1); int temp = NumOfStudents; int x,y,rootx,rooty; while (NumOfPairs--) { scanf("/n%d %d",&x,&y);//300MS //cin>>x>>y;//1800MS rootx=Find(x); rooty=Find(y); if(rootx!=rooty) { NumOfStudents--; Union(rootx,rooty,x,y); } } cout<<"Case "<<Case++<<": "<<NumOfStudents<<endl; } }