拓扑排序 判断给定图是否存在合法拓扑序列 自家oj1393

 1 //拓扑排序判断是否有环
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<string.h>
 5 #include<math.h>
 6 #include<queue>
 7 using namespace std;
 8 typedef long long ll;
 9 const int maxn=1e2+10;
10 int G[maxn][maxn];
11 int in[maxn];
12 void init()
13 {
14     memset(G,0,sizeof(G));  //图
15     memset(in,0,sizeof(in));  //入度
16 }
17 int Toposort(int n)
18 {
19     int aim;
20     int cot=0;
21     int flag=1;  //1的时候表示有序
22     //每一次循环,找出入度为0的点,如果找不到就证明有环(这点强行记忆)
23     //找到之后,将这个点所连的边的另一个端点入度-1;
24     //算法结束
25     for(int i=1;i<=n;i++){
26         int num=0;
27         for(int j=1;j<=n;j++)
28             if(!in[j]){
29                 num++;
30                 aim=j;
31                 break;
32             }
33         if(!num) return 0;  //有环;
34         in[aim]=-1;
35         for(int j=1;j<=n;j++)
36             if(G[aim][j]) in[j]--;
37     }
38     return flag;
39
40 }
41 int main()
42 {
43     int n,m;
44     while(scanf("%d%d",&n,&m)!=EOF){
45         init();  //初始化
46         for(int i=1;i<=m;i++){
47             int u,v;
48             scanf("%d%d",&u,&v);
49             G[u][v]=1;
50             in[v]++;  //u到v有边  所以v的入度++;
51         }
52         int flag=Toposort(n);
53         if(flag==1) printf("YES\n");
54         else printf("NO\n");
55     }
56     return 0;
57 }

.

原文地址:https://www.cnblogs.com/pangbi/p/11832452.html

时间: 2024-10-12 19:48:46

拓扑排序 判断给定图是否存在合法拓扑序列 自家oj1393的相关文章

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

图结构练习——判断给定图是否存在合法拓扑序列 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个有向图,判断该有向图是否存在一个合法的拓扑序列. 输入 输入包含多组,每组格式如下. 第一行包含两个整数n,m,分别代表该有向图的顶点数和边数.(n<=10) 后面m行每行两个整数a b,表示从a到b有一条有向边. 输出 若给定有向图存在合法拓扑序列,则输出YES:否则输出NO. 示例输入 1 0 2 2 1 2 2 1 示例输出 YES NO #inc

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

#include<stdio.h>#include<string.h>int d[15],map[15][15],vis[15];int main(){    int i,j,k,f,n,m,u,v;    while(~scanf("%d%d",&n,&m))    {        memset(d,0,sizeof(d));        memset(map,0,sizeof(map));        memset(vis,0,size

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

#include<iostream> #include<memory.h> using namespace std; int tp[11][11],visit[11]; int main() { int n,m,i,j,k,s,o,c; int flag,count,a,b; while(cin>>n>>m) { s=1; o=0; count=0; memset(tp,0,sizeof(tp)); memset(visit,0,sizeof(visit))

2140=数据结构实验之图论十:判断给定图是否存在合法拓扑序列

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 int map[100][100],visited[100],du[100],flag,n,m,i,j,k; 5 int main() 6 { 7 while(~scanf("%d %d",&n,&m)) 8 { 9 memset(map,0,sizeof(map)); 10 memset(visite

图结构练习——推断给定图是否存在合法拓扑序列(拓扑排序推断环)

图结构练习--推断给定图是否存在合法拓扑序列 Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 给定一个有向图,推断该有向图是否存在一个合法的拓扑序列. 输入 输入包括多组.每组格式例如以下. 第一行包括两个整数n,m.分别代表该有向图的顶点数和边数.(n<=10) 后面m行每行两个整数a b.表示从a到b有一条有向边. 输出 若给定有向图存在合法拓扑序列,则输出YES.否则输出NO. 演示样例输入 1 0 2 2 1 2 2 1 演示样例输出 YES

拓扑排序 --- 判断是否有回路

Legal or Not Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3823    Accepted Submission(s): 1738 Problem Description ACM-DIY is a large QQ group where many excellent acmers get together. It is

HDU2647(拓扑排序+反向建图)

题意不说了,说下思路. 给出的关系是a要求的工资要比b的工资多,由于尽可能的让老板少付钱,那么a的工资就是b的工资+1,可以确定关系为a>b,根据拓扑排序建边的原则是把"小于"关系看成有向边,那么我们可以建边v->u. #include <stdio.h> #include <string.h> #include <string> #include <iostream> #include <algorithm> #

hdoj 4324 Triangle LOVE【拓扑排序判断是否存在环】

Triangle LOVE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 3566    Accepted Submission(s): 1395 Problem Description Recently, scientists find that there is love between any of two people. For

拓扑排序判断有向图是否有回路

1 #include <iostream> 2 #include <queue> 3 #include <string> 4 using namespace std; 5 6 //表结点 7 typedef struct ArcNode{ 8 int adjvex;//该弧所指向的顶点的位置 9 ArcNode *nextarc; 10 }ArcNode; 11 12 //头结点 13 typedef struct VNode{ 14 string data;//顶点信