拓扑排序 uva10305

来源:互联网 发布:ubuntu增加根目录空间 编辑:程序博客网 时间:2024/06/11 16:52
/*#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<string>#include<stack>#include<queue>#include<vector>#include<map>#include<set>#include<iostream>#define LL long long#define INF 0x3f3f3f3fusing namespace std;const int N=1000000009;int G[105][105]= {0};int n,t,c[105]={0},topo[105]={0};bool dfs(int u){    c[u]=-1;    for(int v=1;v<=n;v++) if(G[u][v]){        if(c[v]<0) return false;        else if(!c[v]&&!dfs(v)) return false;    }    c[u]=1;topo[--t]=u;    return true;}bool toposort(){    t=n;    memset(c,0,sizeof(c));    for(int u=1;u<=n;u++) if(!c[u])        if(!dfs(u)) return false;    return true;}int main(){    int m,u,v;    while(scanf("%d%d",&n,&m)&&n&&m)    {        memset(G,0,sizeof(G));        for(int i=0; i<m; i++)        {            scanf("%d%d",&u,&v);            G[u][v]=1;        }        if(toposort())        {            for(int i=0;i<n-1;i++) printf("%d ",topo[i]);            printf("%d\n",topo[n-1]);        }    }    return 0;}*/#include <stdio.h>#include <string.h>int task[102][102];int vis[102];int n,m;int k;int topo[102];int dfs(int u);void toposort(void);int main(){    int i;    int a,b;    while(scanf("%d%d",&n,&m)==2)    {        if(!n&&!m)            break;        memset(task,0,sizeof(task));        memset(vis,0,sizeof(vis));        for(i=0;i<m;i++)        {            scanf("%d%d",&a,&b);            task[a][b]=1;        }        k=n-1;        toposort();        for(i=0;i<n-1;i++)            printf("%d ",topo[i]);        printf("%d\n",topo[n-1]);    }    return 0;}int dfs(int u){    int i;    vis[u]=-1;    for(i=1;i<=n;i++)    {        if(task[u][i])        {            if(vis[i]==-1)                return 0;            else if(!vis[i]&&!dfs(i))                return 0;        }    }    vis[u]=1;    topo[k--]=u;    return 1;}void toposort(){    int i;    for(i=1;i<=n;i++)    {        if(!vis[i])        {            dfs(i);        }    }}

0 0
原创粉丝点击