注册 登录
编程论坛 C++教室

拓补排序

Jason_ 发布于 2019-12-01 14:08, 1598 次点击
题目描述
给出n个点(n<=1000)给出m条有向边(m<=1000);按照拓扑排序顺序输出点的编号,如果遇到环,则输出-1

输入
第一行2个整数n和m
第二行开始连续m行,每行2个整数x和y,表示x这个点有一条指向y这个点的边

输出
按照拓扑排序输出每个点的编号。数字之间有1个空格,如果有多个点都是0入度,则按照数字顺序输出。

样例输入
样例输入一
3 2
1 2
2 3
样例输入二
3 3
1 2
2 3
3 2

样例输出
样例输出一
1 2 3
样例输出二
-1
1 回复
#2
雪影辰风2019-12-13 22:06
温馨提示:作为一名合格的OI队员,要做到独立思考哦!

这道题其实就是一个模拟题(虽然我模拟得很烂),大概是根据作者思路而来的,所以实在没做出也没事,多去理解一下题目的意思,然后再暴力程序上优化
【因为我只测试了几个数据,发现都符合题意,若代码有问题可以回复我,我会尽力改的,谢谢!】
程序代码:
#include<cstdio>
using namespace std;
struct node {
    int x,y;
};
int n,m;
node g[1001];
bool t[1001];
int main() {
    scanf("%d %d",&n,&m);
    for(int i=1; i<=m; i++) {
        scanf("%d %d",&g[i].x,&g[i].y);
        if(t[g[i].y]) {
            printf("-1");
            return 0;
        }
        t[g[i].x]=true;
        t[g[i].y]=true;
    }
    bool first=false;
    for(int i=1; i<=1000; i++) {
        if(t[i]&&first) {
            printf(" %d",i);
            continue;
        }
        if(t[i]) {
            printf("%d",i);
            first=true;
        }
    }
    return 0;
}
1