码迷,mamicode.com
首页 > 编程语言 > 详细

hdu 5154 Harry and Magical Computer 拓扑排序

时间:2016-10-20 21:53:10      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

Harry and Magical Computer

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)


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 2 3 1 2 1 3 3 3 2 2 1 1 3
 

 

Sample Output
YES NO
 

 

Source
 题意:有向图判环;
思路:拓扑完没点;
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define esp 0.00000000001
const int N=2e3+10,M=1e6+10,inf=1e9;
int n,m;
vector<int>edge[N];
int du[N];
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        queue<int>q;
        memset(du,0,sizeof(du));
        for(int i=0;i<=n;i++)
            edge[i].clear();
        int ans=0;
        for(int i=1;i<=m;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            edge[u].push_back(v);
            du[v]++;
        }
        for(int i=1;i<=n;i++)
        {
            if(!du[i])q.push(i);
        }
        while(!q.empty())
        {
            int v=q.front();
            q.pop();
            ans++;
            for(int i=0;i<edge[v].size();i++)
            {
                 du[edge[v][i]]--;
                 if(!du[edge[v][i]])
                    q.push(edge[v][i]);
            }
        }
        if(ans==n)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

 

hdu 5154 Harry and Magical Computer 拓扑排序

标签:

原文地址:http://www.cnblogs.com/jhz033/p/5982254.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!