您的位置:首页 > 其它

死锁 并查集

2012-11-13 21:30 295 查看
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1924

解法之一就是用并查集把点集构成树,如果构成的不是树而有一些点形成环路,那就是说明存在死锁了

题目代码:

#include<iostream>
#include<stdio.h>
using namespace std;
int parent[1000];
void UFset(int n)
{
for(int i=0;i<n;i++)
parent[i]=i;
}
int Find(int x)
{
if(x!=parent[x])
{
return parent[x]=Find(parent[x]);
}
return x;
}
int main()
{
int flag;
int T;
int P,R,E1,E2,p,r;
scanf("%d",&T);
for(int k=1;k<=T;k++)
{
flag=1;
scanf("%d%d%d%d",&P,&R,&E1,&E2);
int N=P+R;
UFset(N);
while(E1--)
{
scanf("%d%d",&p,&r);
r=Find(r+P);
p=Find(p);
if(p==r)
flag=0;
parent[r]=p;
}
while(E2--)
{
scanf("%d%d",&r,&p);
r=Find(r+P);
p=Find(p);
if(p==r)
flag=0;
parent[p]=r;
}
printf("Case %d: ",k);
if(flag==1)
puts("Impossible");
else
puts("Possible");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: