考察并查集,注意:边数可能很大,利用动态数组自动管理。
// 1013. Battle Over Cities.cpp: 主项目文件。 #include "stdafx.h" #include <cstdio> #include <vector> using namespace std; const int N=1003; int fa[N]; typedef struct EDGE{ int from,to; }EDGE; vector<EDGE> road; int n,m,enemy; void init(){ for(int i=0;i<N;i++) fa[i]=-1; } int findSet(int x){ if(fa[x]==-1) return x; int ret=findSet(fa[x]); fa[x]=ret; return ret; } int Union(){ init(); int cnt=0; for(int i=0;i<m;i++){ int ff=road[i].from,tt=road[i].to; if(ff!=enemy&&tt!=enemy){ int root1=findSet(ff); int root2=findSet(tt); if(root1!=root2){ fa[root1]=root2; cnt++; } } } return n-2-cnt; } int main() { int num; scanf("%d%d%d",&n,&m,&num); for(int i=0;i<m;i++){ int from,to; scanf("%d%d",&from,&to); EDGE edge; edge.from=from,edge.to=to; road.push_back(edge); } while(num--){ scanf("%d",&enemy); int res=Union(); printf("%d\n",res); } return 0; }