time limit: 1 second
memory limit: 128 mb
【問題描述】
你是乙個體育報社的記者,你接受到乙個艱難的任務:有n支足球隊參加足球比賽,現在給你一些比賽的結果,需要你給出各支球
隊的排名,從1到n。
以下是給你的一些資訊:
(1) 沒有平局;
(2) 不同的球隊排名不能相同;
(3) 對於所有滿足(1<=a),(a小於b),(b<=n),第a名的球隊一定可以打敗第b名的球隊。
給你部分比賽結果,要求給出排名,並且判斷是否存在另一種排名方法滿足給你的比賽結果。
【資料範圍】
30%的資料 (1<=n<=7,1<=m<=15)
60%的資料(1<=n<=100,1<=m<=2000)
【輸入格式】
第一行輸入n(1<=n<=5000),表示球隊的數量,編號為1到n。第二行輸入m(1<=m<=100,000),表示給出的比賽場數,接下來m行,每
行兩個整數x_i,y_i,表示x_i能打敗y_i。
【輸出格式】
輸出包含n+1行,前n行描述球隊的排名,第i個數表示第i名的球隊,第n+1行包含乙個整數,如果為0表示不存在其他的排名方法,否則為1表示還有其他的排名方法。
sample input
4 5
1 2
3 1
3 2
3 4
4 1sample output
3 4
1 2
0sample input1
3 2
2 1
2 3sample output1
2 1 3 1
【題目鏈結】:
【題解】
拓撲排序;
對於給的關係(x,y)
建一條從x指向y的單向邊;
y的入度遞增;
然後做拓撲排序;
每次找入度為0的點;
(直接輸出)
然後修改它的鄰點的入度;(遞減1)
如果有一次找到的入度為0的點大於1;
就說明有多個拓撲序;
說明有多個排名;
否則沒有;
(平台沒有特判,每次輸出的時候找標號最小的輸出,[斜眼笑])
【完整**】
#include
#include
using
namespace
std;
#define rei(x) scanf("%d",&x)
#define rep1(i,x,y) for (int i = x;i <= y;i++)
const
int maxn = 5e3+100;
int n,m,du[maxn],yes = 0;
vector
g[maxn];
int main()
while (true)
if (cnt>1) yes = 1;
if (j==-1)
break;
du[j] = -1;
int len = g[j].size();
rep1(i,0,len-1)
du[g[j][i]]--;
printf("%d\n",j);
}printf("%d\n",yes);
return
0;}
NOI2004T1 鬱悶的出納員 平衡樹入門題
題目 鬱悶的出納員 做法 了解平衡樹這個資料結構的人應該一眼就能看出這個題目可以用平衡樹做 平衡樹的教程網上太多了,這裡就不贅述了 用平衡樹維護插入 刪除 查詢第k小 注意由於題目中詢問第k大,就是查詢第 目前員工數 k 1 小 的操作即可,再用乙個數delta來記錄工資的整體變化量,注意處理就可以...