1. 程式人生 > >【演算法模板】拓撲排序

【演算法模板】拓撲排序

模板題:

獎金

   Time Limit: 1000 ms     Memory Limit: 128 MB

Description

        由於無敵的凡凡在2005年世界英俊帥氣男總決選中勝出,Yali Company總經理Mr.Z心情好,決定給每位員工發獎金。公司決定以每個人本年在公司的貢獻為標準來計算他們得到獎金的多少。

        於是Mr.Z下令召開m方會談。每位參加會談的代表提出了自己的意見:“我認為員工a的獎金應該比b高!”Mr.Z決定要找出一種獎金方案,滿足各位代表的意見,且同時使得總獎金數最少。每位員工獎金最少為100元。

Input

第一行兩個整數n,m,表示員工總數和代表數;

以下m行,每行2個整數a,b,表示某個代表認為第a號員工獎金應該比第b號員工高。

Output

若無法找到合法方案,則輸出“-1”;否則輸出一個數表示最少總獎金。

Sample Input

2 1
1 2

Sample Output

201

拓撲程式碼:

#include<iostream>
#include<vector>
#include<queue>
using namespace std;

int d[10001],n,m,a,b,count,ans,val[10001];
vector<int> g[10001];
queue<int> q;

int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>a>>b;
        g[b].push_back(a);
        d[a]++;
    }
    for(int i=1;i<=n;i++)
    {
        if(d[i]==0)
        {
            val[i]=100;
            q.push(i);
        }
    }
    while(!q.empty())
    {
        int v=q.front();
        q.pop();
        count++;
        ans+=val[v];
        for(int i=0;i<g[v].size();i++)
        {
            int u=g[v][i];
            d[u]--;
            val[u]=max(val[u],val[v]+1);
            if(d[u]==0)q.push(u);
        }
    }
    if(count==n)cout<<ans;
    else cout<<-1;
    return 0;
}