当前位置: 代码迷 >> 电脑整机及配件 >> HDOJ 标题5154 Harry and Magical Computer(拓扑排序)
  详细解决方案

HDOJ 标题5154 Harry and Magical Computer(拓扑排序)

热度:436   发布时间:2016-04-29 02:40:27.0
HDOJ 题目5154 Harry and Magical Computer(拓扑排序)

Harry and Magical Computer

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1046    Accepted Submission(s): 424


Problem Description
In reward of being yearly outstanding magic student, Harry gets a magical computer. When the computer begins to deal with a process, it will work until the ending of the processes. One day the computer got n processes to deal with. We number the processes from 1 to n. However there are some dependencies between some processes. When there exists a dependencies (a, b), it means process b must be finished before process a. By knowing all the m dependencies, Harry wants to know if the computer can finish all the n processes.
 

Input
There are several test cases, you should process to the end of file.
For each test case, there are two numbers n m on the first line, indicates the number processes and the number of dependencies. 1≤n≤100,1≤m≤10000
The next following m lines, each line contains two numbers a b, indicates a dependencies (a, b). 1≤a,b≤n
 

Output
Output one line for each test case. 
If the computer can finish all the process print "YES" (Without quotes).
Else print "NO" (Without quotes).
 

Sample Input
3 23 12 13 33 22 11 3
 

Sample Output
YESNO
 

Source
BestCoder Round #25
 

Recommend
heyang   |   We have carefully selected several similar problems for you:  5185 5184 5183 5182 5181 
 
ac代码
#include<stdio.h>#include<string.h>int n,m;int dig[1010],map[1010][1010];int topu(){	int i,j;	for(i=1;i<=n;i++)	{		int u=-1;		for(j=1;j<=n;j++)		{			if(dig[j]==0)			{				dig[j]--;				u=j;				break;			}		}		if(u==-1)			return 0;		for(j=1;j<=n;j++)		{			if(map[u][j])			{				dig[j]--;				map[u][j]=0;			}		}	}	return 1;}int main(){	while(scanf("%d%d",&n,&m)!=EOF)	{		int i;		memset(map,0,sizeof(map));		memset(dig,0,sizeof(dig));		for(i=0;i<m;i++)		{			int u,v;			scanf("%d%d",&u,&v);			if(!map[u][v])			{				map[u][v]=1;				dig[v]++;			}		}		if(topu())		{			printf("YES\n");		}		else			printf("NO\n");	}}


  相关解决方案