poj3687拓扑排序

反向建图

#include <cstdio>

#include <cstring>

#include <algorithm>

#include <climits>

#include <string>

#include <iostream>

#include <map>

#include <cstdlib>

#include <list>

#include <set>

#include <queue>

#include <stack>



using namespace std;

const int INF=0xfffffff;



int main()

{

    int n,m,Icase;

    int vis[300];

    int G[300][300];

    int in[300];

    int topo[300];

    while(cin>>Icase){

        while(Icase--){

            memset(topo,0,sizeof(topo));

            memset(G,0,sizeof(G));

            memset(vis,0,sizeof(vis));

            memset(in,0,sizeof(in));

            cin>>n>>m;

            for(int i=0;i<m;i++){

                int a,b;

                cin>>a>>b;

                if(!G[a][b]){

                    in[a]++;

                    G[a][b]=1;

                }

            }

            int flag=1;

            for(int i=n;i>=1;i--){

                int sign;

                bool t=false;

                for(int j=1;j<=n;j++){

                    if(in[j]==0&&!vis[j]){

                        sign=j; t=true;

                    }

                }

                if(!t){

                    flag=0;break;

                }

              //  vis[sign]=1;

                topo[i]=sign;

              //  cout<<topo[i]<<endl;system("pause");

                for(int j=1;j<=n;j++){

                    if(!vis[j]&&G[j][sign]){

                        in[j]--;

                    }

                }

                vis[sign]=1;

            }



            if(!flag)cout<<-1<<endl;

            else{

                int a[300];

                for(int i=1;i<=n;i++){

                    a[topo[i]]=i;

                }

                for(int i=1;i<=n;i++){

                    if(i==1) cout<<a[i];

                    else cout<<" "<<a[i];

                }

                cout<<endl;

            }

        }

    }

    return 0;

}

  

你可能感兴趣的:(poj)