您的位置:首页 > 其它

浙大PAT甲级-1013

2017-07-04 12:39 309 查看
网上说这是在考查并查集的相关算法

而我是用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  浙大 PAT 甲级 1013