题意:有几个点去掉之后会影响q1 与q2 两点之间的连通性。然后我想的是能不能直接在并查集上修改?比如说1去掉了之后,并查集上将关于1的点都。。。但是发现并不容易,其实和重新建一个并查集没有什么区别。然后就重新建一个并查集。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <sstream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int dis[1005];
vector<int > v[1005];
int temp[1005];
void init()
{
for(int i=1;i<1002;i++)
dis[i]=i;
}
int findf(int k)
{
if(k==dis[k])
return k;
else return k=findf(dis[k]);
}
int main(int argc, char *argv[]) {
int n,m;
scanf("%d %d",&n,&m);
init();
for(int i=0;i<m;i++)
{
int a,b;
scanf("%d %d",&a,&b);
v[a].push_back(b);
v[b].push_back(a);
int root1=findf(a);
int root2=findf(b);
if(root1!=root2)
dis[root1]=root2;
}
int q1,q2,ans=0;
scanf("%d %d",&q1,&q2);
int root1=findf(q1);
int root2=findf(q2);
if(root1!=root2) printf("-1");
else{
for(int i=1;i<=n;i++)
{
if(i==q1||i==q2) continue;
init();
for(int j=1;j<=n;j++)
{
if(i==j) continue;
for(int k=0;k<v[j].size();k++)
{
int gg=v[j][k];
if(gg==i) continue;//这个别忘了
int r1=findf(gg);
int r2=findf(j);
if(r1!=r2) dis[r1]=r2;
}
}
root1=findf(q1);
root2=findf(q2);
if(root1!=root2) ans++;
}
printf("%d\n",ans);
}
return 0;
}