NC54280. GJX与死锁
描述
死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。
A set of processes is deadlocked when each process in the set is blocked awaiting an event that can only be triggered by another blocked process in the set.
现在,GJX拥有n个进程。为了简化问题,每个进程占用1个资源,请求1个资源。任一时刻只允许一个进程使用资源,进程在请求其余资源时,不主动释放已经占用的资源,进程已经占用的资源,不会被强制剥夺。现在请你编写程序,确认是否会发生死锁。
输入描述
第一行,一个数n,表示进程数量。
接下来n行,每一行两个数,代表每个进程所占用的资源及请求的资源。
输出描述
一行,若会发生死锁,则输出YES,反之,输出NO。
示例1
输入:
4 1 2 2 3 3 4 4 1
输出:
YES
示例2
输入:
4 1 2 3 2 5 4 6 4
输出:
NO
Java 解法, 执行用时: 1874ms, 内存消耗: 70096K, 提交时间: 2022-06-19 19:26:58
import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main { static Map<Integer, Integer> deadlock = new HashMap<>(); static boolean isdeadlock = false; public static void main(String[] args) { Scanner in = new Scanner(System.in); Map<Integer, Integer> map = new HashMap<>(); int q = in.nextInt(); while(q --> 0){ Integer occ = in.nextInt(); Integer req = in.nextInt(); map.put(occ, req); } map.forEach((k, v) ->{ if (isDeadLock(k, map)) { isdeadlock = true; return; } }); System.out.println(isdeadlock ? "YES" : "NO"); in.close(); } public static boolean isDeadLock(Integer i, Map<Integer, Integer> map){ Integer val = map.get(i); if (val == null) { deadlock.clear(); return false; } else { if (deadlock.get(val) != null) { return true; } deadlock.put(i, val); map.put(i, null); return isDeadLock(val, map); } } }
C++14(g++5.4) 解法, 执行用时: 125ms, 内存消耗: 7856K, 提交时间: 2019-10-26 15:50:06
#include<cstdio> using namespace std; int c[500010]={0}; int a[200010],cnt=0; int n; bool vis[500010]={0}; bool exist[500010]={0}; bool flag=0; void dfs(int r){ if(vis[r]==1)return; vis[r]=1;exist[r]=1; if(exist[c[r]]==1){ flag=1; return; } if(c[r]!=0) dfs(c[r]); exist[r]=0; } int main(){ scanf("%d",&n); int x,y; for(int i=1;i<=n;i++){ scanf("%d%d",&x,&y); a[++cnt]=x; c[x]=y; } for(int i=1;i<=cnt;i++){ if(flag==0&&vis[a[i]]==0){ dfs(a[i]); } } if(flag==0){ printf("NO"); } else{ printf("YES"); } return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 542ms, 内存消耗: 15532K, 提交时间: 2019-10-26 17:39:26
#include <iostream> #include <cstring> #include <list> #include <stdio.h> using namespace std; int main() { list<int> l; int n,cnt=0; cin>>n; int k=n; while(n--) { int a,b; cin>>a>>b; l.insert(l.begin(),a); l.insert(l.begin(),b); } l.sort(); l.unique(); list<int> :: iterator it; for(it=l.begin();it!=l.end();it++) { cnt++; } if(cnt==k) cout<<"YES"<<endl; else cout<<"NO"<<endl; return 0; }