并查集,先将路径存储下来,每次考虑一个城市的时候,在路径集合中跳过与该城市相连的边,判断此时有几个集合(未考虑的这个城市单独为一个集合)
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
struct Edge
{
int v1;
int v2;
};
int n, m, k;
int findRoot(int *nodes, int x)
{
while(nodes[x] != x)
{
x = nodes[x];
}
return x;
}
void join(int *nodes, int v1, int v2)
{
int root1 = findRoot(nodes, v1);
int root2 = findRoot(nodes, v2);
if(root1 != root2)
nodes[root2] = root1;
}
int main()
{
int point;
int sets;
int *nodes;
Edge *edges;
cin >> n >> m >> k;
edges = new Edge[m];
nodes = new int[n+1];
for(int i = 0; i < m; i++)
cin >> edges[i].v1 >> edges[i].v2;
for(int i = 0; i < k; i++)
{
cin >> point;
for(int j = 0; j <= n; j++)
nodes[j] = j;
for(int j = 0; j < m; j++)
{
if(edges[j].v1 != point && edges[j].v2 != point)
{
join(nodes, edges[j].v1, edges[j].v2);
}
}
sets = 0;
for(int j = 1; j <= n; j++)
{
if(j == nodes[j])
sets++;
}
cout << sets-2 << endl;
}
return 0;
}