死锁

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

在操作系统中存在着死锁问题。

进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了死锁。

例如,如果线程A占用了资源1并等待资源2,而线程B占用了资源2并等待资源1,这样两个线程就发生了死锁现象。

为了描述系统资源分配的问题,我们用一张有向图G <v,e>来表示资源分配图。V为有向图的顶点集,包括进程结点集合P={p 1,p 2,…,p n}和资源结点集合R={r 1,r 2,…,r m}两种;E为有向边的集合,其元素包括二元组(p i,r j)或(r j,p i)。(p i,r j)表示进程p i申请资源r j,(r j,p i)表示资源r j被进程p i占用。

根据操作系统中的知识可以知道,如果在一个资源分配图中,从任意一个结点出发,都不存在一条路径能回到自身,则系统中没有死锁,否则系统中可能存在死锁。

你的任务是对于给你的一张资源分配图,判断是否可能存在死锁。

Input

输入第一行是一个整数T,,表示有T组数据。

每组数据的第一行是四个整数P,R,E1,E2,其中P表示进程结点数,R表示资源结点数,E1表示(pi,rj)边数,E2表示(rj,pi)边数,1 <= P,R <= 500。接下来E1行每行两个整数pi,rj,表示从结点pi到rj有一条边。接下来E2行每行两个整数rj,pi,表示从结点rj到pi有一条边。0 <= pi < P, 0 <= rj <R。

Output

对于每组数据输出一行先输出组数(从1开始),接着如果可能存在死锁输出”Possible”;如果不可能存在死锁输出一行“Impossible”。

Sample Input

2 2 2 1 1 0 1 0 1 3 3 3 4 0 0 1 1 2 2 0 1 2 0 2 1 1 2

Sample Output

Case 1: Impossible Case 2: Possible
 
 
1.toposort_dfs:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxv=1100;
int c[maxv];
int G[maxv][maxv];
int topo[maxv],t,n;
bool dfs(int u){ c[u]=-1;
for(int v=0;v<n;v++){ if(G[u][v]){ if(c[v]<0){ return false;
}else if(!c[v]&&!dfs(v)){ return false;
}
}
}
c[u]=1;
topo[--t]=u;
return true;
}
bool toposort(){ t=n;
memset(c,0,sizeof(c));
for(int u=0;u<n;u++)
if(!c[u])
if(!dfs(u))
return false;
return true;
}
int main(){ int t,cnt=0;
scanf("%d",&t);
while(t--){ memset(G,0,sizeof(G)); int P,R,E1,E2;
scanf("%d%d%d%d",&P,&R,&E1,&E2);
n=P+R;
for(int i=0;i<E1;i++){ int tmp,tm;
scanf("%d%d",&tmp,&tm);
G[tmp][tm+P]=1;
}
for(int i=0;i<E2;i++){ int tmp,tm;
scanf("%d%d",&tmp,&tm);
G[tmp+P][tm]=1;
}
if(toposort()){ printf("Case %d: Impossible\n",++cnt);
}else{
printf("Case %d: Possible\n",++cnt);
}
}
return 0;
}

  
2.toposort_bfs:

#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
const int maxv=1100;
int G[maxv][maxv];
int indegree[maxv];
int n;
queue<int>Q;
bool toposort(){ int flag=0;
while(!Q.empty())
Q.pop();
for(int i=0;i<n;i++){ if(indegree[i]==0){ Q.push(i); }
}
if(Q.empty()){ return false;
}
int tmp;
while(!Q.empty()){ tmp=Q.front();
Q.pop();
flag++;
for(int i=0;i<n;i++){ if(G[tmp][i]){ indegree[i]--;
if(indegree[i]==0){ Q.push(i); }
}
}
}
if(flag==n)
return true;
return false;
}
int main(){ int t,cnt=0;
scanf("%d",&t);
while(t--){ memset(indegree,0,sizeof(indegree));
memset(G,0,sizeof(G));
int P,R,E1,E2;
scanf("%d%d%d%d",&P,&R,&E1,&E2);
n=P+R;
for(int i=0;i<E1;i++){ int tmu,tmv;
scanf("%d %d",&tmu,&tmv);
G[tmu][tmv+P]=1;
indegree[tmv+P]++;
}
for(int i=0;i<E2;i++){ int tmu,tmv;
scanf("%d%d",&tmu,&tmv);
G[tmu+P][tmv]=1;
indegree[tmv]++;
}
if(toposort())
printf("Case %d: Impossible\n",++cnt);
else{
printf("Case %d: Possible\n",++cnt);
}
} return 0;
}

 

FZU 1924——死锁——————【topo判环】的更多相关文章

  1. E - Andrew and Taxi-二分答案-topo判环

    E - Andrew and Taxi 思路 :min max   明显二分答案,二分需要破坏的那些边的中机器人数量最多的那个. check 过程建边时直接忽略掉小于 mid 的边,这样去检验有无环存 ...

  2. hdu 4324 Triangle LOVE(拓扑判环)

    Triangle LOVE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...

  3. CodeForces-1217D (拓扑排序/dfs 判环)

    题意 https://vjudge.net/problem/CodeForces-1217D 请给一个有向图着色,使得没有一个环只有一个颜色,您需要最小化使用颜色的数量. 思路 因为是有向图,每个环两 ...

  4. Coloring Edges 【拓扑判环】

    题目链接:https://vjudge.net/contest/330119#problem/A 题目大意: 1.给出一张有向图,给该图涂色,要求同一个环里的边不可以全部都为同一种颜色.问最少需要多少 ...

  5. hdu4975 A simple Gaussian elimination problem.(正确解法 最大流+删边判环)(Updated 2014-10-16)

    这题标程是错的,网上很多题解也是错的. http://acm.hdu.edu.cn/showproblem.php?pid=4975 2014 Multi-University Training Co ...

  6. hdu4888 Redraw Beautiful Drawings 最大流+判环

    hdu4888 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/6553 ...

  7. Leetcode 166. Fraction to Recurring Decimal 弗洛伊德判环

    分数转小数,要求输出循环小数 如2 3 输出0.(6) 弗洛伊德判环的原理是在一个圈里,如果一个人的速度是另一个人的两倍,那个人就能追上另一个人.代码中one就是速度1的人,而two就是速度为2的人. ...

  8. Leetcode 202 Happy Number 弗洛伊德判环解循环

    今天先谈下弗洛伊德判环,弗洛伊德判环原来是在一个圈内有两人跑步,同时起跑,一人的速度是另一人的两倍,则那个人能在下一圈追上另一个人,弗洛伊德判环能解数字会循环出现的题,比如说判断一个链表是不是循环链表 ...

  9. Dwarves (有向图判环)

    Dwarves 时间限制: 1 Sec  内存限制: 64 MB提交: 14  解决: 4[提交][状态][讨论版] 题目描述 Once upon a time, there arose a huge ...

随机推荐

  1. 移植 libevent-2.0.22-stable 到ARM平台

    ARM 移植: 移植简单来讲就是使用ARM的编译环境,重新编译一份ARM平台上可以使用的库或执行文件,一般只需要重新制定C编译器和C++编译器即可. 特别注意的地方: 不能从windows解压文件后再 ...

  2. Vue vue-resource发送Http请求

    vue-resource 1.cnpm install vue-resource --save 2.在main.js中import VueResource from 'vue-resource' 3. ...

  3. 安卓开发时访问google方法

    启动浏览器后15秒左右,浏览器的右上角就会出现图标 启用防火墙功能(右上角墙形图标),这时候程序就会去寻找网上代理,从而达到访问GOOGLE的效果,提示如果不访问google网站,可再点击一下关闭防火 ...

  4. p2p_server

    以太坊系列之十九 对p2p模块server的理解 type transport interface { // The two handshakes. doEncHandshake(prv *ecdsa ...

  5. 一文读懂spring boot 和微服务的关系

    欢迎访问网易云社区,了解更多网易技术产品运营经验. Spring Boot 和微服务没关系, Java 微服务治理框架普遍用的是 Spring Cloud. Spring Boot 产生的背景,是开发 ...

  6. <select>标签默认值设置

    <td> <label>操作类型:</label> <select id="operation_type" class="com ...

  7. [SinGuLaRiTy] 复习模板-数据结构

    [SinGuLaRiTy-1040] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 二维线段树 2D_Segment_Tree //示例:单 ...

  8. SDUT OJ 顺序表应用5:有序顺序表归并

    顺序表应用5:有序顺序表归并 Time Limit: 100 ms Memory Limit: 880 KiB Submit Statistic Discuss Problem Description ...

  9. ob系列函数归纳

     输出控制函数(output control函数) flush — 刷新输出缓冲ob_clean — 清空(擦掉)输出缓冲区ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲ob_end_ ...

  10. 4A - Horse

    打表找规律 #include <iostream> #include <queue> using namespace std; ][]; ]{, , , , -, -, -, ...