FZU 1924——死锁——————【topo判环】
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
每组数据的第一行是四个整数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
Sample Input
Sample Output
#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判环】的更多相关文章
- E - Andrew and Taxi-二分答案-topo判环
E - Andrew and Taxi 思路 :min max 明显二分答案,二分需要破坏的那些边的中机器人数量最多的那个. check 过程建边时直接忽略掉小于 mid 的边,这样去检验有无环存 ...
- hdu 4324 Triangle LOVE(拓扑判环)
Triangle LOVE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- CodeForces-1217D (拓扑排序/dfs 判环)
题意 https://vjudge.net/problem/CodeForces-1217D 请给一个有向图着色,使得没有一个环只有一个颜色,您需要最小化使用颜色的数量. 思路 因为是有向图,每个环两 ...
- Coloring Edges 【拓扑判环】
题目链接:https://vjudge.net/contest/330119#problem/A 题目大意: 1.给出一张有向图,给该图涂色,要求同一个环里的边不可以全部都为同一种颜色.问最少需要多少 ...
- hdu4975 A simple Gaussian elimination problem.(正确解法 最大流+删边判环)(Updated 2014-10-16)
这题标程是错的,网上很多题解也是错的. http://acm.hdu.edu.cn/showproblem.php?pid=4975 2014 Multi-University Training Co ...
- hdu4888 Redraw Beautiful Drawings 最大流+判环
hdu4888 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/6553 ...
- Leetcode 166. Fraction to Recurring Decimal 弗洛伊德判环
分数转小数,要求输出循环小数 如2 3 输出0.(6) 弗洛伊德判环的原理是在一个圈里,如果一个人的速度是另一个人的两倍,那个人就能追上另一个人.代码中one就是速度1的人,而two就是速度为2的人. ...
- Leetcode 202 Happy Number 弗洛伊德判环解循环
今天先谈下弗洛伊德判环,弗洛伊德判环原来是在一个圈内有两人跑步,同时起跑,一人的速度是另一人的两倍,则那个人能在下一圈追上另一个人,弗洛伊德判环能解数字会循环出现的题,比如说判断一个链表是不是循环链表 ...
- Dwarves (有向图判环)
Dwarves 时间限制: 1 Sec 内存限制: 64 MB提交: 14 解决: 4[提交][状态][讨论版] 题目描述 Once upon a time, there arose a huge ...
随机推荐
- kubernetes dashboard 安装
环境:CentOS Linux release 7.3.1611 (Core)IP:192.168.0.103 [1]组件安装yum install device-mapperyum install ...
- C# 密封(2)
上一章节说到 sealed 作用于类,那么sealed 作用到方法和成员上面该如何呢. 在C# 中 Sealed作用于方法必须是重写之后的方法.也就是override+sealed.在之后别的类在继 ...
- mysqldump备份以tmp_开头的表
需要备份warehouse这个DB下所有以tmp_开头的表名.直接说结论: mysqldump .sql.gz 其中:-Bse是为了将查询中的-----------------等分隔符给屏蔽了. gz ...
- kali linux之选择和修改exp与windows后渗透
网上公开的exp代码,选择可信赖的exp源,exploit-db,securityfocus,searchsploit,有能力修改exp(python,perl,ruby,c,c++.......) ...
- 【转】ASCII码十进制、十六进制对照表
源地址:https://www.baidu.com/link?url=3bScEOF5BVXt7ptGDjBV5JmynXHqEh5lyut1vUx6vEM7qqPY1vtbO22Vvy7xUoFd& ...
- 【转】VS2010不能引用System.Data.OracleClient解决方法
源地址:http://blog.csdn.net/iloli/article/details/8484674
- jeecms学习笔记
jeecms学习笔记 内容管理系统 1.栏目列表标签 作用:获取栏目的列表 [@cms_channel_list] [#list tag_list as b] <a href="${b ...
- 神奇的Form表单
今天坐标单上传,提交的按钮使用了<button>,发现不论怎么写ajax和设置form表单,都会刷新页面,百思不得解,然后偶然间把<button>变成<input typ ...
- Freeman链码
[简介] 链码(又称为freeman码)是用曲线起始点的坐标和边界点方向代码来描述曲线或边界的方法,常被用来在图像处理.计算机图形学.模式识别等领域中表示曲线和区域边界.它是一种边界的编码表示法,用边 ...
- json、xml
json:(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然 ...