1.并查集
int find(int x)//并查集查找最终所属区域的方法
{
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
ac代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
int fa[1010];
struct node{
int x,y;
bool operator < (const node s)const
{
if(x==s.x) return y<s.y;
return x<s.x;
}
}path[2010];
int find(int x)//查找最终所属区域
{return x == fa[x] ? x : fa[x] = find(fa[x]);}
void zs(int x,int y)//点下标区域同值化
{
if(find(x)!=find(y)) fa[find(x)] = find(y);
}
int main()
{
int a,b;
int xx,yy;
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++) fa[i] = i;//并查集初始化
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
if( a > b) swap(a,b);//交换a,b值使得前者比后者小
path[i].x = a;
path[i].y = b;
}
scanf("%d%d",&xx,&yy);
sort(path,path+m);
for(int i = 0; i < m; i ++)
zs(path[i].x,path[i].y);
for(int i = 1; i <= n; i++)
find(i);//将同区域的地址置同值
if( fa[xx] != fa[yy])
{
printf("-1\n");
return 0;
}
int cnt = 0;
for(int i = 1; i <= n; i ++)
if( i != xx && i != yy)
{
for(int j = 0; j <= n; j ++) fa[j] = j;
for(int j = 0; j < m; j ++)
{
if( path[j].x == i || path[j].y == i) continue;
zs(path[j].x,path[j].y);
}
for(int k = 1; k <= n; k++)find(k);
if( fa[xx] != fa[yy]) cnt ++;
}
printf("%d\n",cnt);
return 0;
}