题目链接: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; }