SDUT 3304 拓扑排序(链表)

选课大作战

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

眼看着大一新生就要来了,原大一的成了学叔学婶。

小C又在为了新学期的选课问题忙了起来。。。。。渐渐地他发现了一个问题:当他想学“计算机网络”这门课时,选课系统告诉他必须学过“离散数学”才能学这门科目。

所以我们就称“离散数学”是“计算机网络”的必学科目。现在已知选课系统收集了很多科目的顺序关系,但是,这个选课系统出了一些故障,一些信息可能不准确,所以请你来帮小C判断一下信息是否错误,首先信息错误是指“科目X是科目Y的必学科目,同时科目Y也是科目X的必学科目”,"科目X是科目Y的必学科目,科目Y是科目Z的必学科目,科目Z是科目X的必学科目"这类也是错误的。

输入

第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的前置课程。

输出

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

示例输入

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

示例输出

Wrong
Correct

提示



提示

来源

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

int T,n,m;
struct node
{
    int to;
    node *next;
}*temp;
node *List[100010];
int du[100010];
int Topsort()
{
    int i,top=-1;
    int flag=0;
    int pos=0;
    for(int i=0;i<n;i++)
    {
        if(du[i]==0)
        {
            du[i]=top;
            top=i;
        }
    }
    for(int i=0;i<n;i++)
    {
        if(top==-1)
        {
            flag=1;
            break;
        }
        else
        {
            int j=top;
            top=du[top];
            temp=List[j];
            while(temp)
            {
                int k=temp->to;
                if(--du[k]==0)
                {
                    du[k]=top;
                    top=k;
                }
                temp=temp->next;
            }
        }
    }
    if(flag)
        printf("Wrong\n");
    else
        printf("Correct\n");
}
int main()
{
    while(~scanf("%d",&T))
    {
        while(T--)
        {
            memset(List,0,sizeof(List));
            memset(du,0,sizeof(du));
            scanf("%d%d",&n,&m);
            for(int i=0; i<m; i++)
            {
                int u,v;
                scanf("%d%d",&u,&v);
                u--,v--;
                du[v]++;
                temp=new node;
                temp->to=v;
                temp->next=NULL;
                if(List[u]==NULL)
                    List[u]=temp;
                else
                {
                    temp->next=List[u];
                    List[u]=temp;
                }
            }
            Topsort();

        }
    }
}
 

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 18:58:17

SDUT 3304 拓扑排序(链表)的相关文章

图论基础——邻接链表存图+拓扑排序

邻接链表存图,在这里其实是用数组进行模拟的 又叫做链式存储法,本来是要用链表实现的,但大多数情况下只需要用数组模拟即可 例: u(边的起点) v(边的终点) w(边的权值) 4 2 1 1 2 3 1 4 1 1 5 2 4 3 4 2 3 1 话不多说,直接上代码 for(int i=1;i<=m;i++) { scanf("%d%d%d",&u1,&v1,&w1); e[i].u =u1;//赋给第i条边的起点 e[i].v =v1;//赋给第i条边的

图论 邻接链表存储 BFS DFS 拓扑排序

package Algorithms; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.Stack; public class Graphic { public static class Vertex{ public int num;//节点编号 public int weight;//边的权重 public Vertex next;//指向顶点的

hdu1285 拓扑排序

思路: 选择一个入度为0的顶点并输出,从网中删除此顶点及所有出边. 循环结束后,若输出的定点数小于网中的顶点数,则输出有回路信息,否则输出的顶点就是一种拓扑序列. 具体实现方法:邻接表,时间复杂度较小,邻接矩阵,时间复杂度高 确定比赛名次 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,

杭电ACM2094——产生冠军~~拓扑排序

题目的意思,如题.很容易明白. 解决的方法就是拓扑排序,就可以很容易的解决了. 每输入一对选手,判断两个选手是否出现过,没有出现过,新建一个头结点,加入到邻接表中,更新结点的入度. 最后判断是否存在一个结点的入度为0,有,则Yes,否则No. 我用的是STL中的list容器来创建的邻接表. 下面的是 AC的代码: #include <iostream> #include <list> #include <cstring> using namespace std; cla

算法与数据结构基础10:C++实现——拓扑排序

一 定义 拓扑排序是对有向无环图(Directed Acyclic Graph简称DAG)顶点的一种排序, 它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面. 二 先决条件 能够进行拓扑排序图有两个先决条件:有向.无环,即有向无环图. 三 偏序全序 连通图:任意两点之间都存在至少一条边 偏序:非连通图(有向无环图满足偏序关系) 全序:单连通图 四 结果唯一性 对于仅满足偏序关系的有向无环图中,因为有两个点之间的关系是不确定的,所以导致排序的结果是不唯一的. 满足全序关系的有

【每日算法】图算法(遍历&amp;MST&amp;最短路径&amp;拓扑排序)

图有邻接矩阵和邻接表两种存储方法,邻接矩阵很简单,这里不讨论,下面我们先看看常用的邻接表表示方法. 邻接表常用表示方法 指针表示法 指针表示法一共需要两个结构体: struct ArcNode //定义边表结点 { int adjvex: //邻接点域 ArcNode* next; }; struct VertexNode //定义顶点表结点 { int vertex; ArcNode* firstedge; }; 每个节点对应一个VertexNode,其firstedge指向边表(与当前节点邻

拓扑排序((算法竞赛入门经典)刘汝佳)

转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents [分析](小白) 把每一个变量看成一个点,"小于"关系看成有向边,则我们得到了一个有向图.这样,我们的任务实际上是把一个图的全部结点排序,使得每一条有向边(u,v)相应的u都排在v的前面.在图论中,这个问题称为拓扑排序. 不难发现:假设图中存在有向环,则不存在拓扑排序,反之则存在.我们把不包括有向环的有向图称为有向无环图.能够借助dfs函数完毕拓扑排序:在訪问完一个结点

拓扑排序,判断有向图中是否有环

[原创] 今天我们来聊聊有向图中环的判断,在数据结构中我们知道,通过拓扑排序可以判断有向图中是否存在环,对于有向图的存储我们采用邻接表的形势,这里为了简化链表的操作,我们省略了链表,避免了指针的麻烦,直接采用了c++中的vector来模拟链表,操作更加的方便:具体详细的使用,建议百度一下,这里不多说,至于拓扑排序的具体思想,相信大家应该都了解,那么直接上代码,如果有不理解的,建议查阅数据结构书籍,搞懂思想,结合这份代码,很好理解 1 #include <stdio.h> 2 #include

确定比赛名次(拓扑排序)

http://acm.hdu.edu.cn/showproblem.php?pid=1285 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 16504    Accepted Submission(s): 6534 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....