您的位置:首页 > 其它

PAT 1013. Battle Over Cities (25)(并查集||DFS)

2016-05-27 16:13 344 查看
题意:给出n个城市之间的路径,假如其中有一座城市被包围了,需要另外修多少条路使得另外的城市是连通的。

思路:我们可以每次查询的时候建立并查集,并且将当前点除去,然后进行并查集的统计。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
#include<queue>
#define inf 0x3f3f3f3f
#define LL __int64
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;

int f[1010],a[1000010],b[1000010];

int fi(int x){
return x==f[x]?x:f[x] = fi(f[x]);
}

void mer(int a,int b){
int x = fi(a);
int y = fi(b);
x > y?f[x] = y:f[y] = x;
}

int main(){
int n,m,i,j,k;
while(~scanf("%d%d%d",&n,&m,&k)){
for(i = 0;i < m;++ i){
scanf("%d%d",&a[i],&b[i]);
}
while(k--){
for(i = 0;i <= n;++ i)
f[i] = i;
scanf("%d",&j);
int ans = 0;
for(i = 0;i < m;++ i){
if(a[i]==j||b[i]==j)continue;
mer(a[i],b[i]);
}
for(i = 1;i <=n;++ i){
if(i!=j&&f[i]==i){
ans++;
}
}
printf("%d\n",ans-1);
}
}
return 0;
}

DFS:#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
#include<queue>
#define inf 0x3f3f3f3f
#define LL __int64
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
int n,j;
bool mp[1010][1010],vis[1010];

void DFS(int u){
for(int i = 1;i <= n;++i){
if(mp[u][i]&&!vis[i]){
vis[i] = true;DFS(i);
}
}
}
int main(){
int m,i,k,a,b;
while(~scanf("%d%d%d",&n,&m,&k)){
memset(mp,0,sizeof(mp));
for(i = 0;i < m;++ i){
scanf("%d%d",&a,&b);
mp[a][b] = mp[b][a] = 1;
}
while(k--){
for(i = 0;i <= n;++ i)
vis[i] = false;
scanf("%d",&j);
int ans = 0;
vis[j] = true;
for(i = 1;i <= n;++ i){
if(!vis[i]){
ans++;
DFS(i);
}
}
printf("%d\n",ans-1);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: