【拓扑排序】【DP】奖金(ssl 1325)
生活随笔
收集整理的這篇文章主要介紹了
【拓扑排序】【DP】奖金(ssl 1325)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
獎金
ssl 1325
題目大意:
有n個人,某個人要比另外一個人的工資高(工資最低為100,最少多1元),問最少發多少工資
原題:
題目描述
由于無敵的凡凡在2005年世界英俊帥氣男總決選中勝出,Yali Company總經理Mr.Z心情好,決定給每位員工發獎金。公司決定以每個人本年在公司的貢獻為標準來計算他們得到獎金的多少。
于是Mr.Z下令召開m方會談。每位參加會談的代表提出了自己的意見:“我認為員工a的獎金應該比b高!”Mr.Z決定要找出一種獎金方案,滿足各位代表的意見,且同時使得總獎金數最少。每位員工獎金最少為100元。
輸入
兩個整數n,m,表示員工總數和代表數;
以下m行,每行2個整數a,b,表示某個代表認為第a號員工獎金應該比第b號員工高。
輸出
若無法找到合法方案,則輸出“-1”;否則輸出一個數表示最少總獎金。
輸出樣例
2 1 1 2輸入樣例
201數據范圍:
80%的數據滿足n<=1000,m<=2000;
100%的數據滿足n<=10000,m<=20000。
解題思路:
這就是拓撲排序,先按順序拓撲排序一遍,中途順便DP(以100為低值),因為要求最小所以一定是上一個數+1,然后有多個條件是就要求最大的
代碼:
#include<queue> #include<cstdio> #include<cstring> #include<iostream> using namespace std; int n,m,x,y,h,tot,sum,rd[10500],head[10500],ans[10500]; struct rec {int to,next; }a[20500]; void topsort()//拓撲排序 {queue<int>d;for (int i=1;i<=n;++i)if (!rd[i]) d.push(i),ans[i]=100;//入度為0的while(!d.empty()){h=d.front();d.pop();for (int i=head[h];i;i=a[i].next){rd[a[i].to]--;ans[a[i].to]=max(ans[h]+1,ans[a[i].to]);//取最大if (!rd[a[i].to])//入度為0{rd[a[i].to]--;d.push(a[i].to);}}} } int main() {scanf("%d %d",&n,&m);for (int i=1;i<=m;++i){scanf("%d %d",&x,&y);a[++tot].to=x;a[tot].next=head[y];head[y]=tot;rd[x]++;}topsort();for (int i=1;i<=n;++i)if (rd[i]<=0) sum+=ans[i];//符合else{sum=-1;//存在環break;}printf("%d",sum); }總結
以上是生活随笔為你收集整理的【拓扑排序】【DP】奖金(ssl 1325)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 硬件需求测试如何测试电脑硬件
- 下一篇: 如何查看电脑配置win7如何查看电脑配置