ZCMU—1606

1606: 大二上之锋芒显露

Time Limit: 1 Sec  Memory Limit: 128 MB
[Submit][Status][Web Board]

Description

这个时候的你在学习数据结构与算法,这个时候你可以轻松的判断老师的排的课表对不对了,因为每一门课都有先修课。所以。。。


Input

第1行:1个整数T,表示数据的组数T(1 <= T <= 5)
接下来T组数据按照以下格式:
第1行:2个整数,N,M。N表示课程总数量,课程编号为1..N。M表示顺序关系的数量。1 <= N <= 100,000. 1 <= M <= 500,000
第2..M+1行:每行2个整数,A,B。表示课程A是课程B的前置课程。


Output

第1..T行:每行1个字符串,若该组信息无误,输出"Correct",若该组信息有误,输出"Wrong"。

Sample Input

2
2 2
1 2
2 1
3 2
1 2
1 3

Sample Output

Wrong
Correct

【分析】

不错的一道题...记录每门课的先修课有几门,然后在每门课记录它是哪几门课的先修课..
类似拓扑排序,入度为0的课开始删除,直到入度为0的课删光,然后判断删除的课够不够n门,或者判断剩余还有没有课没有被删除。就可以判断信息是否有误.
用比较容易懂的话说就是
把当前已经没有先修课的一门课从容器中删除,也就是删除a.end(),在删除这门课的时候同时把他儿子节点的入度减一。如果某一门课的入度为0,那么把他加入容器a.
直到a容器为空。判断课程信息即可。
很不错的一道题。。。但是奈何....杰哥的数据真心硬。。居然有不存在这门课的情况需要考虑....
直接导致了我1/16的提交...
比如n=2
但是我输入的A和B可能会出现4,5......我去
【代码】
#include <bits/stdc++.h>
using namespace std;
int n,m;
vector <int >a[1010000];
int f[1010000];
vector<int>q;
void judge()
{
    q.clear();
for(int i=1;i<=n;i++)
        if(f[i]==0) 
        {
q.push_back(i);
    //printf("%d*****\n",i);
}
int sum=0;
    while(!q.empty())
    {
        int x=q.back();
        q.pop_back();
        sum++;
        for(int i=0;i<a[x].size();i++)
        {
        // cout<<a[x][i]<<' '<<f[a[x][i]]<<endl;
        f[a[x][i]]--;
//  cout<<a[x][i]<<' '<<f[a[x][i]]<<endl;
            if(f[a[x][i]]==0) q.push_back(a[x][i]);
        }
    }
    if(sum<n) 
printf("Wrong\n");
    else
printf("Correct\n");
}
int main()
{
    int pp;scanf("%d",&pp);
    while(pp--)
    {
    int t=0;
        scanf("%d%d",&n,&m);
        memset(f,0,sizeof(f));
        for (int i=1;i<=n;i++) a[i].clear();
        for (int i=0;i<m;i++)
        {
            int x,y;scanf("%d%d",&x,&y);
            a[x].push_back(y);
            f[y]++;
            if (x<=0 || x>n || y<=0 || y>n) t=1;
        }
        if (n==1) printf("Correct\n");
        else
        if (t) printf("Wrong\n");
        else
        judge();
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值