POJ 2367 topo

来源:互联网 发布:淘宝网天猫女冬皮鞋 编辑:程序博客网 时间:2024/05/17 09:17
//just 模板题。////toposort//给出大于和小于关系,实际上是要找一条边连接这些点。//如果图中存在有向环,则不存在拓扑排序,反之则存在////有向无环图#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#define MAXN 500using namespace std;int G[MAXN][MAXN];int c[MAXN];int topo[MAXN],t;///用于存排序后的点int n;//本题属于最基础的拓扑排序。大意就是,给出一个数n,//然后底下n行,编号1到n, 每行输入几个数,保证结果中该行的编号要在这几个数前面。bool dfs(int u) ///0-n-1个点{    c[u]=-1;    for(int v=1;v<=n;v++)    if(G[u][v])///在访问这个点时,c[i]=-1,如果找到-1,即回到了这个点,即有环    {        if(c[v]<0)   return false;///存在有向环,失败退出。        else if(!c[v]&&!dfs(v))  return false;///未访问过而且找不到下一个连接的点,则返回false    }    //cout<<"miao"<<endl;    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;///这个点找不到连接,returned false;        }    return true;}int main(){    int a;    //freopen("in.txt","r",stdin);    while(scanf("%d",&n)!=EOF)    {        for(int i=1;i<=n;i++)        {            while(1)            {            scanf("%d",&a);            if(a==0) break;            G[i][a]=1;           // cout<<i<<" "<<a<<endl;            }        }        toposort();        for(int i=1;i<=n-1;i++)            cout<<topo[i]<<" ";            cout<<topo[n]<<endl;    }}

0 0
原创粉丝点击