1013 Battle Over Cities [并查集]
题目大意就是给出几个城市相连的图,把其中某个城市连同它与其他城市的的路径一起去掉,问最少需要加几条路让剩余的城市都相连。
这应该是并查集的基础题了,把其中一个点去掉,看一下剩下几个集合减一就得到最少结果了。注意一下路径数组的范围。详见代码。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <string.h> #include <cstdio> #include <string> #include <map> using namespace std; #define maxn 1005 int n,m,k,p; int s[maxn*maxn],t[maxn*maxn]; int fa[maxn]; int find(int x) { return x==fa[x]?x:fa[x]=find(fa[x]); } void init() { for(int i=0;i<=maxn;i++) fa[i]=i; } int main() { scanf("%d%d%d",&n,&m,&k); for(int i=0;i<m;i++) { scanf( "%d%d",&s[i],&t[i]); } while(k--) { init(); int cnt=0; scanf("%d",&p); for(int i=0;i<m;i++) { if(s[i]==p||t[i]==p) continue; int ta=find(s[i]); int tb=find(t[i]); if(ta!=tb) fa[ta]=tb; } for(int i=1;i<=n;i++) { if(fa[i]==i) cnt++; } printf("%d\n",cnt-2); } return 0; }