列表

详情


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;
}

上一题