//图的遍历
#include <cstdio>
#include <queue>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
const int maxv = 2011,inf = 1<<30;
//int G[maxv][maxv] = {0};
vector<int>G[maxv];
int n,m,k;
bool vis[maxv] = {false};
int current;
void Dfs(int v)
{
if(v==current) return;
vis[v] = true;
for(int i = 0;i<G[v].size();i++)
{
if(vis[G[v][i]] == false)
Dfs(G[v][i]);
}
}
void dfsTra(int& ans)
{
for(int i = 1;i<=n;i++)
{
if(vis[i] == false && i!=current)
{
Dfs(i);
ans++;
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i = 1;i<=m;i++)
{
int id1,id2;
scanf("%d%d",&id1,&id2);
G[id1].push_back(id2);
G[id2].push_back(id1);
}
for(int i = 1;i<=k;i++)
{
scanf("%d",¤t);
int ans = 0;
// fill(vis,vis+maxv,0);
memset(vis,false,sizeof(vis));
dfsTra(ans);
printf("%d\n",ans-1);
}
return 0;
}
并查集
#include <cstdio>
#include <queue>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
const int maxv = 2011,inf = 1<<30;
int father[maxv];
vector<int>G[maxv];
int n,m,k;
bool vis[maxv] = {false};
int current;
void init()
{
for(int i = 1;i<=n;i++)
{
father[i] = i;
vis[i] = false;
}
}
int findFather(int x)
{
int a = x;
while(father[x] != x)
x = father[x];
while(father[a] != a)
{
int z = a;
father[a] = x;
a = father[z];
}
return x;
}
void unit(int a,int b)
{
int faA = findFather(a);
int faB = findFather(b);
if(faA != faB)
father[faA] = faB;
}
int main()
{
freopen("1.txt","r",stdin);
scanf("%d%d%d",&n,&m,&k);
for(int i = 1;i<=m;i++)
{
int id1,id2;
scanf("%d%d",&id1,&id2);
G[id1].push_back(id2);
G[id2].push_back(id1);
}
for(int i = 1;i<=k;i++)
{
scanf("%d",¤t);
init();//?
for(int j = 1;j<=n;j++)
{
for(int z = 0;z<G[j].size();z++)
{
int u = j,v=G[j][z];
if(u == current || v== current) continue;//?
unit(u,v);
}
}
int ans = 0;
for(int z = 1;z<=n;z++)
{
if(z==current) continue;//?
if(vis[findFather(z)]==false)
{
vis[findFather(z)] = true;
ans++;
}
}
printf("%d\n",ans-1);
}
return 0;
}