浙大PAT甲級-1013
阿新 • • 發佈:2019-02-01
網上說這是在考查並查集的相關演算法
而我是用dfs暴力解決的(差點超時)
int isConnect(){ int repair=0; for(int i=1;i<=n;i++){ if(i!=c&&connect[i]==0) repair++; dfs(i); } return repair-1; }---------------------------------------------
#include <iostream> using namespace std; int map[1001][1001]; int emap[1001][1001]; int city[1001]; int connect[1001]; int n, m, k, c; void init(){ for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++) map[i][j]=emap[i][j]=0; city[i]=0; connect[i]=0; } } void occupy(int x){ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) emap[i][j]=map[i][j]; for(int i=1;i<=n;i++) emap[x][i]=emap[i][x]=0; } void dfs(int a){ for(int i=1;i<=n;i++){ if(i!=c&&i!=a&&emap[a][i]==1&&connect[i]==0){ connect[i]=1; dfs(i); } } } int isConnect(){ int repair=0; for(int i=1;i<=n;i++){ if(i!=c&&connect[i]==0) repair++; dfs(i); } return repair-1; } int main() { int i; cin>>n>>m>>k; init(); i=m; while(i--){ int a,b; cin>>a>>b; map[a][b]=map[b][a]=1; } i=0; while(i<k){ int a; cin>>a; city[i]=a; i++; } for(i=0;i<k;i++){ occupy(city[i]); c=city[i]; cout<<isConnect()<<endl; for(int j=1;j<=n;j++) connect[j]=0; } return 0; }