SDNU 1089.拓扑排序【找入度为0的节点 拓扑排序】

1089.拓扑排序

Description

给定一个有向图,若图无环,则将其进行拓扑排序并输出,否则输出IMPOSABLE。

Input

第一行为两个整数n(1<=n<=1000)、m(1<=m<=100000);

之后m行,每行两个整数a、b表示一条从a到b的有向边。

Output

若存在环,输出IMPOSABLE,否则输出一行用一个空格隔开的拓扑排序的结果,若存在多个结果,输出字典序最小的。

Sample Input

5 4
1 2
2 3
3 4
4 5

Sample Output

1 2 3 4 5

每次找入度为0的节点。

#include<cstdio>
#include<cstring>
#include<vector>
#include<string>
#include<iostream>
using namespace std;
const int maxn=1010;
int out[maxn]={0},c[maxn]={0},n,m,x,cnt=0;
vector<int>G[maxn];
vector<int>topo;
bool toposort(){
    while(cnt!=n){
        bool key=false;
        for(int i=1;i<=n;i++)//每次找入度为0的节点
            if(out[i]==0&&c[i]==0){
                c[i]=1; x=i;
                key=true; break;
            }
        if(key==false) return false;//存在环
        topo.push_back(x); cnt++;
        for(int i=0;i<G[x].size();i++)
            out[G[x][i]]--;
    }
    return true;
}
int main(){
    scanf("%d%d",&n,&m);
    int u,v;
    for(int i=0;i<m;i++){
        scanf("%d%d",&u,&v);
        G[u].push_back(v);
        out[v]++;
    }
    if(toposort()){
        for(int i=0;i<n;i++){
            if(i!=0) printf(" ");
            printf("%d",topo[i]);
        }
        printf("\n");
    }
    else printf("IMPOSABLE\n");
    return 0;
}

时间: 2024-08-28 05:53:28

SDNU 1089.拓扑排序【找入度为0的节点 拓扑排序】的相关文章

SDNU 1089.拓扑排序(拓扑判环小顶堆)

Description 给定一个有向图,若图无环,则将其进行拓扑排序并输出,否则输出IMPOSABLE. Input 第一行为两个整数n(1<=n<=1000).m(1<=m<=100000): 之后m行,每行两个整数a.b(0 < a, b <= n)表示一条从a到b的有向边. Output 若存在环,输出IMPOSABLE,否则输出一行用一个空格隔开的拓扑排序的结果,若存在多个结果,输出字典序最小的. Sample Input 5 4 1 2 2 3 3 4 4 5

拓扑排序找最大环最小环

找最大环 P5145 漂浮的鸭子 题意很明确:求图中的最大环 今天新学到的一种方法--拓扑排序求环 由于拓扑排序每次都是从入度为0的点开始,而环上的点的入度都不会为0,所以环上的点就不会参加排序,也就是说,经过拓扑排序后剩下的边和点构成的都是环. 这样我们就可以直接把每个环扫一遍记录最大环就结束了. //2019/09/27 #include<bits/stdc++.h> using namespace std; template <typename T>inline void r

【CodeForces】915 D. Almost Acyclic Graph 拓扑排序找环

[题目]D. Almost Acyclic Graph [题意]给定n个点的有向图(无重边),问能否删除一条边使得全图无环.n<=500,m<=10^5. [算法]拓扑排序 [题解]找到一个简单环,则欲删除的边一定经过该环.尝试环上的每一条边(至多n条边)后再次拓扑排序判断全图是否有环. 拓扑排序后定位到简单环:剩余图是环+环内DAG,DFS过程中将走入死路的点标-1,访问过标1,找到访问过的点就是简单环.换起始点直到找到环为止. 复杂度O(nm). #include<cstdio>

拓扑排序 判断给定图是否存在合法拓扑序列 自家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];

(hdu step 5.2.6)确定比赛名次(求入度为0的点的个数)

题目: 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 338 Accepted Submission(s): 181   Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得

POJ1236 (强连通分量缩点求入度为0和出度为0的分量个数)

Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13804   Accepted: 5507 Description A number of schools are connected to a computer network. Agreements have been developed among those schools: each school maintains a li

POJ 1236--Network of Schools【scc缩点构图 &amp;&amp; 求scc入度为0的个数 &amp;&amp; 求最少加几条边使图变成强联通】

Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13325   Accepted: 5328 Description A number of schools are connected to a computer network. Agreements have been developed among those schools: each school maintains a li

Reachability from the Capital CodeForces - 999E(强连通分量 缩点 入度为0的点)

题意: 问至少加几条边 能使点s可以到达所有的点 解析: 无向图的连通分量意义就是  在这个连通分量里 没两个点之间至少有一条可以相互到达的路径 所以 我们符合这种关系的点放在一起, 由s向这些点的任意一个连边即可 即为求除s所在的连通分量以外的  入度为0的连通分量 #include <bits/stdc++.h> #define mem(a, b) memset(a, b, sizeof(a)) #define rap(i, a, n) for(int i=a; i<=n; i++)

从0开始学算法--排序(1.8桶排序)

算法理解: 桶排序是对计数排序的一种优化,在计数排序中x应该放在计数数组下表为x的位置上,这样如果重复数字较少,计数数组每个位置的利用率就非常小. 桶排序是将一系列大小近似的数字放在一个位置(每个桶维护一条有序的链表),这样提高每个位置的利用率,以提高效率. 以A[]={1,21,23,41,49}为例 假设每个桶里有10中元素,那么桶排序的结构如下图所示. #include <algorithm> #include <iostream> #include <cstring&