UVA 10305 拓扑排序

Time Limit: 3000MS  64bit IO Format: %lld & %llu

 Status uDebug

Description

Download as PDF
Problem descriptions:
System Crawler 2016-08-23
Initialization.
acmparand 2013-08-23


#include"iostream"
#include"stdio.h"
#include"vector"
#include"functional"
#include"string"
#include"cstring"
#include"algorithm"
#include"queue"
using namespace std;
typedef pair<int,int> pii;
typedef vector<int> vi;
const int maxn=200;
int cnt[maxn];
int g[maxn][maxn];
int visit[maxn];
int topo[maxn];
int t;
int n,m;
bool dfs(int u)
{
    visit[u]=-1; //正在访问
    for(int v=0;v<n;v++)
    {
        if(g[u][v])
        {
            if(visit[v]<0) return false; //自环 与u邻接的点正在被访问
            else if(!visit[v])
                dfs(v);  //未访问 就去访问它
        }
    }
    visit[u]=1; //标记为访问
    topo[--t]=u;

    return true;
}
bool topo_sort()
{
    t=n;
    memset(visit,0,sizeof(visit));
    for(int u=0;u<n;u++)
    if(!visit[u])
    {
        bool res=dfs(u);
        if(res==false) return false; //有自环
    }
    return true;
}
int main()
{
    /*
    freopen("b.in","r",stdin);
    freopen("b.out","w",stdout);
    */
    while(cin>>n>>m&&(n+m))
    {
        int i;
        memset(g,0,sizeof(g));
        for(i=0;i<m;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            u--;v--;
            g[u][v]=1;
        }
        bool fuck=topo_sort();
        if(fuck==false) {cout<<"No"<<endl;continue;}
        for(i=0;i<n-1;i++)
            cout<<topo[i]+1<<" ";
        cout<<topo[n-1]+1<<endl;
    }
    return 0;
}

#include"iostream"
#include"stdio.h"
#include"vector"
#include"functional"
#include"string"
#include"cstring"
#include"algorithm"
#include"queue"
using namespace std;
typedef pair<int,int> pii;
typedef vector<int> vi;
const int maxn=200;
vi g[maxn];
int visit[maxn];
int topo[maxn];
int t,n,m;
bool dfs(int u)
{
    visit[u]=-1; //正在访问
    for(int i=0;i<g[u].size();i++)
    {
        int v=g[u][i];
        if(visit[v]<0) return false; //自环 与u邻接的点正在被访问
        else if(!visit[v])
            dfs(v);  //未访问 就去访问它
    }
    visit[u]=1; //标记为访问
    topo[--t]=u;

    return true;
}
bool topo_sort()
{
    t=n;
    memset(visit,0,sizeof(visit));
    for(int u=0;u<n;u++)
    if(!visit[u])
    {
        bool res=dfs(u);
        if(res==false) return false; //有自环
    }
    return true;
}
int main()
{
    /*
    freopen("b.in","r",stdin);
    freopen("b.out","w",stdout);
    */
    while(cin>>n>>m&&(n+m))
    {
        int i;
        memset(g,0,sizeof(g));
        for(i=0;i<m;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            u--;v--;
            g[u].push_back(v);
        }
        bool fuck=topo_sort();
        if(fuck==false) {cout<<"No"<<endl;continue;}
        for(i=0;i<n-1;i++)
            cout<<topo[i]+1<<" ";
        cout<<topo[n-1]+1<<endl;
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值