拓扑排序

View Code
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;

int timef = 0;

int n,m ;
int x,y;
int a[1000][1000];// 图的邻接矩阵

int f[1000];  //完成时间

int vis[1000];  //1代表 被发现 2代表 已完成



void DFS(int u)
{
       vis[u] = 1;   //记录发现时刻

       for(int v=1; v<=n; v++) //adj(u)   //O(E)
              if(a[u][v] && vis[v]==0)
               DFS(v);

       vis[u] = 2;  //记录完成时刻
       timef++;
       f[u] = timef;
}

void DFS_main()   //O(V+E)
{
       timef = 0;

       for(int i=1; i<=n; i++)             /// O(V)
       {
              if(vis[i] == 0)
                     DFS(i);
       }
}


void Topological_sort()      //O(V+E)
{
       int tp[1000];            ////存放拓扑序列1..V
       DFS_main();

       for(int i=1; i<=n; i++)   //按finish的时间倒序存放在tp序列tp中
        tp[n-f[i]+1] = i;

       for(int i=1; i<=n; i++)
              cout<<tp[i]<<" ";
       cout<<endl;
}



int main()
{
       memset(vis,0,sizeof(vis));
       scanf("%d%d",&n,&m);
       for(int i=1;i<=m;i++)
       {scanf("%d%d",&x,&y);
       a[x][y]=1;}

       Topological_sort();
       return 0;
}

什么玩意。。。还是不太明白

posted on 2013-04-29 17:37  Fray  阅读(128)  评论(0编辑  收藏  举报

导航