圖論

拓撲排序

/* 優先隊列 */
const int maxn=505;
int a[maxn][maxn],n,in[maxn];
void topsort()
{
    priority_queue<int,vector<int>,greater<int> > q;
    while(!q.empty())q.pop();
    for(int i=1;i<=n;++i)
        if(in[i]==0)q.push(i);
    while(!q.empty())
    {
        int tp=q.top();
        printf("%d\n",tp);
        q.pop();
        for(int i=1;i<=n;++i)
            if(a[tp][i])
        {
            in[i]--;
            if(in[i]==0)q.push(i);
        }
    }
}

例題 - HDU 1285c++

#include<bits/stdc++.h>
using namespace std;
#define ms(a,x) memset(a,x,sizeof a)
const int maxn=505;
int a[maxn][maxn],n,m,in[maxn],ans[maxn];
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        ms(a,0);
        ms(in,0);
        for(int i=1;i<=m;++i)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            if(a[x][y])continue;//數據有重複
            a[x][y]=1;
            in[y]++;
        }
        priority_queue<int,vector<int>,greater<int> > q;
        while(!q.empty())q.pop();
        for(int i=1;i<=n;++i)
            if(in[i]==0)q.push(i);
        int cnt=0;
        while(!q.empty())
        {
            int tp=q.top();
            ans[++cnt]=tp;
            q.pop();
            for(int i=1;i<=n;++i)
                if(a[tp][i])
            {
                in[i]--;
                if(in[i]==0)q.push(i);
            }
        }
        for(int i=1;i<n;++i)printf("%d ",ans[i]);
        printf("%d\n",ans[n]);//末尾無空格
    }
}
相關文章
相關標籤/搜索