拓扑排序(给任务排序,UVA 10305)

来源:互联网 发布:数据库触发器工作原理 编辑:程序博客网 时间:2024/05/29 18:22

dfs实现


拓扑排序的结果又不唯一,别看到跟样例不一样就觉得自己错了嘛。


代码

#include<bits/stdc++.h>using namespace std;int n,m;////////////////////////////////edgesstruct Edge{    int to,next;}edges[10010];int head[110],tot;void init(){    memset(head,-1,sizeof(head));    tot=0;}void add(int from,int to){    edges[tot].to=to;    edges[tot].next=head[from];    head[from]=tot++;}/////////////////////////////////int ans[110];int t;int vis[110];bool dfs(int u){    vis[u]=-1;    for(int e=head[u];~e;e=edges[e].next)    {        int v=edges[e].to;        if(vis[v]==-1) return false;        if(!vis[v]&&!dfs(v)) return false;    }    vis[u]=1;    ans[t--]=u;    return true;}bool toposort(){    for(int i=1;i<=n;i++)        if(!vis[i]&&!dfs(i)) return false;    return true;}int main(){    while(scanf("%d %d",&n,&m)==2&&(n+m))    {        init();        memset(vis,0,sizeof(vis));        t=n;        int u,v;        while(m--)        {            scanf("%d %d",&u,&v);            add(u,v);        }        assert(toposort());        for(int i=1;i<=n;i++)            printf("%d%c",ans[i],i==n?'\n':' ');    }    return 0;}


0 0
原创粉丝点击