hdu 1285 拓扑排序模板

 

拓扑排序的开棺题:

 

这题的坑点是:

多组数据,记得输出换行符(题目没讲)

要求输出的时候冠军的编号在前,建边的时候逆向一下,从赢的指向输的可以保证赢家在前;

开一个优先队列可以保证序号小的在前;

--

#include <iostream>
#include <math.h>
#include <string.h>
#include <vector>
#include <map>
#include <queue>
#include <stdio.h>
#include <algorithm>
#include <cstdio>
using namespace std;
priority_queue<int,vector<int>,greater<int>>q;
int in[100000],d[1000][1000],n,m;
void solve( )
{
    
    for(int i=1;i<=n;i++)
    {
        if(in[i]==0)
        {
            q.push(i);
        }
    }
    
    int ok=0;
    
    while(!q.empty())
    {
        int v=q.top();
        q.pop();
        if(ok==0)
        {   ok=1;
            printf("%d",v);
        }
        else 
        {
            printf("% d",v);
        }
        
        for(int i=1;i<=n;i++)
        {
            if(d[i][v]!=0)
            {
                in[i]--;
                d[i][v]=0;
                if(!in[i])
                {
                    q.push(i); 
                }
            }
        }
    }
cout<<endl;
}
int main()
{ 

//freopen("lys.in","r",stdin);

while(cin>>n>>m)
  {
  memset(d,0,sizeof(d));
  memset(in,0,sizeof(in));
  
  for(int i=1;i<=m;i++)
  {
    int a,b;
    cin>>a>>b;
    if(d[b][a]==0)
    {
     d[b][a]=1;
     in[b]++;    
    }    
  }
  solve();    
  }

}

 

posted @ 2021-11-02 15:36  liyishui  阅读(26)  评论(0编辑  收藏  举报