zcmu2095 危险系数

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_41058467/article/details/80999055