#include<iostream>\n#include<cstdio>\n#include<cstring>\nusing namespace std;\nint v[510];\nint per[510];\nstruct Edge\n{\n\tint a,b;\n}e[5005];\nint find(int t)\n{\n\treturn v[t]==t?t:v[t]=find(v[t]);\n}\nvoid Union(int x,int y)\n{\n\tint p1=find(x);\n\tint p2=find(y);\n\tif(p1!=p2)\n\t\tv[p1]=p2;\n}\nint count(int z)\n{\n\tint counts=0;\n\tfor(int i=0;i<z;i++)\n\t\tif(v[i]==i)\n\t\t\tcounts++;\n\treturn counts;\n}\nvoid INI()\n{\n\tfor(int i=0;i<510;i++)\n\t\tv[i]=i;\n}\nint main()\n{\n\tINI();\n\tmemset(per,0,sizeof(per));\n\tint n,m,k;\n\tcin>>n>>m;\n\tfor(int i=0;i<m;i++)\n\t{\n\t\tscanf("%d%d",&e[i].a,&e[i].b);\n\t\tUnion(e[i].a,e[i].b);\n\t}\n\tint c1=count(n);\n\tcin>>k;\n\tfor(int j=0;j<k;j++)\n\t{\n\t\tint c2=0;\n\t\tint p;\n\t\tcin>>p;\n\t\tper[p]=1;\n\t\tINI();\n\t\tfor(int i=0;i<m;i++)\n\t\t{\n\t\t\tif(per[e[i].a]==1||per[e[i].b]==1)\n\t\t\t\tcontinue;\n\t\t\tUnion(e[i].a,e[i].b);\n\t\t}\n\t\tc2=count(n);\n\t\tif(c1+1 == c2||c1 ==c2)\n\t\t\tprintf("City %d is lost.\n",p);\n\t\telse\n\t\t\tprintf("Red Alert: City %d is lost!\n",p);\n\t\tc1 = c2;\n\t}\n\tc1=count(n);\n\tif(c1==n)\n\t\tprintf("Game Over.\n");\n\treturn 0;\n

并查集算法判断城市连通性:C++ 代码实现及解析

原文地址: https://www.cveoy.top/t/topic/qjbF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录