SDUT2140_图结构练习——判断给定图是否存在合法拓扑序列(邻接表)

来源:互联网 发布:神结局电影 知乎 编辑:程序博客网 时间:2024/05/22 07:57

图结构练习——判断给定图是否存在合法拓扑序列

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

题目描述

 给定一个有向图,判断该有向图是否存在一个合法的拓扑序列。

输入

 输入包含多组,每组格式如下。
第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)
后面m行每行两个整数a b,表示从a到b有一条有向边。
 

输出

 若给定有向图存在合法拓扑序列,则输出YES;否则输出NO。
 

示例输入

1 02 21 22 1

示例输出

YESNO

提示

解题报告
邻接表实现。。。
#include <iostream>#include <stdio.h>#include<string.h>using namespace std;int n,m;struct node{    int u,v,w;    int next;} edge[1000];int cnt,d[1000],head[1000];void add(int u,int v,int w){    edge[cnt].v=v;    edge[cnt].w=w;    edge[cnt].next=head[u];    head[u]=cnt++;}void tops(){    int i,j,c=0,u;    for(i=0; i<n; i++)    {        u=-1;        for(j=0; j<n; j++)        {            if(d[j]==0)            {                u=j;                d[j]--;                c++;                break;            }        }        for(j=head[u]; j!=-1; j=edge[j].next)        {            if(edge[j].w==1)            {                d[edge[j].v]--;                edge[j].w=0;            }        }    }    if(c!=n)        printf("NO\n");    else printf("YES\n");}int main(){    int a,b,i,j;    while(~scanf("%d%d",&n,&m))    {        cnt=0;        memset(head,-1,sizeof(head));        memset(d,0,sizeof(d));        memset(edge,0,sizeof(edge));        for(i=0; i<m; i++)        {            scanf("%d%d",&a,&b);            add(a,b,1);            d[b]++;        }        tops();    }    return 0;} /**************************************Problem id: SDUT OJ 2140 User name: acm2013叶思俊 Result: Accepted Take Memory: 468K Take Time: 0MS Submit Time: 2014-02-26 16:24:10  **************************************/


0 0
原创粉丝点击