題目描述
由於公司在2023年的銷售業務成績優秀,公司總經理心情大好,決定給每位員工發獎金。公司決定以每個人本年在公司的貢獻為標準來計算他們得到獎金的多少。於是總經理下令召開 m 方會談。每位參加會談的代表提出了自己的意見:「我認為員工 a 的獎金應該比 b 高!」。總經理決定要找出一種獎金方案,滿足各位代表的意見,且同時使得總獎金數最少。每位員工獎金最少為100元。
輸入格式
第一行兩個整數 n 和 m,表示員工總數和代表數;
接下來有 m 行,每行 2 個整數 a 和 b,表示某個代表認為第 a 號員工獎金應該比第 b 號員工高。
輸出格式
若無法找到合理方案,則輸出「poor xed」;否則輸出乙個數表示最少總獎金。
樣例資料 1
輸入 [複製]
2 1
1 2輸出
201備註
【資料規模】
80%的資料滿足:n<=1000,m<=2000;
100%的資料滿足:n<=10000,m<=20000。
如果把每個人當成點,則「我認為員工a的獎金應該比b高」就意味著點與點之間有先後關係,從b因一條線到a。這樣就可以畫出乙個有向圖。當能找到乙個拓撲排序時就說明可以找到一種方案,但如果找不到乙個拓撲排序,就說明這個有向圖有環,找不到合適的方案。問題解決。
舉個例子來看:
樣例:5 4
4 2
3 4
5 4
3 5
對應的圖為:
拓撲排序的規則:入度為0的入佇列,所有在每乙個點入佇列 時就可以確定他的錢數。即1,2入佇列時他們是初始值100, 4入佇列時,他的是2的錢數+1.依次類推。所以用陣列mon[i]表示第i個人的獎金數則 :
mon[1]=mon[2]=100;
mon[4]=mon[2]+1;
mon[5]=mon[4]+1;
mon[3]=mon[5]+1;
**為:
#include#include #include#includeusing namespace std;
int r[10005],m,n,money;
queueq;//佇列
//鄰接表儲存
struct edgee[20005];
int head[10005],mon[10005],num=0;
bool topsort() //拓撲排序
while(!q.empty()) //tot頂點個數
}
} if(tot==n) return true;
else return false;
}void addedge(int x,int y)
int main()
money=0;
if(topsort())cout網上有很多題解,但方法與我不同,多多思考,總是會有意想不到的驚喜。
獎金 拓撲排序
由於公司在2013年的銷售業務成績優秀,公司總經理心情大好,決定給每位員工發獎金。公司決定以每個人本年在公司的貢獻為標準來計算他們得到獎金的多少。於是總經理下令召開 m 方會談。每位參加會談的代表提出了自己的意見 我認為員工 a 的獎金應該比 b 高!總經理決定要找出一種獎金方案,滿足各位代表的意見...
拓撲排序 獎金
由於無敵的凡凡在2005年世界英俊帥氣男總決選中勝出,yali company總經理mr.z心情好,決定給每位員工發獎金。公司決定以每個人本年在公司的貢獻為標準來計算他們得到獎金的多少。於是mr.z下令召開 mm 方會談。每位參加會談的代表提出了自己的意見 我認為員工 aa 的獎金應該比 bb 高!...
拓撲排序 C語言 鄰接表
資料結構 typedef struct side 邊 side,slink typedef struct vertex 頂點 vertex,adjlist 20 typedef struct graph 圖 graph,glink 建立 void creategraph glink g printf...