一:原題內容
problem description
有n個比賽隊(1<=n<=500),編號依次為1,2,3,。。。。,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在裁判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2,用p1,p2表示,排名時p1在p2之前。現在請你程式設計序確定排名。
input
輸入有若干組,每組中的第一行為二個數n(1<=n<=500),m;其中n表示隊伍的個數,m表示接著有m行的輸入資料。接下來的m行資料中,每行也有兩個整數p1,p2表示即p1隊贏了p2隊。
output
給出乙個符合要求的排名。輸出時隊伍號之間有空格,最後一名後面沒有空格。
其他說明:符合條件的排名可能不是唯一的,此時要求輸出時編號小的隊伍在前;輸入資料保證是正確的,即輸入資料確保一定能有乙個符合要求的排名。
sample input
4 31 22 3
4 3
sample output
1 2 4 3
二:分析理解
很簡單,直接看**。
這裡有個技巧,題目要求,其他說明:符合條件的排名可能不是唯一的,此時要求輸出時編號小的隊伍在前;輸入資料保證是正確的,即輸入資料確保一定能有乙個符合要求的排名。這個地方該怎麼處理,其實就是從小到大找到乙個入度0的點後,要開始刪除與它的邊,這時不把入度0的點放進queue,而是再次從小到大開始找,這樣就保證題意。
三:ac**
#include#include#includeusing namespace std;
#define n 505
int map[n][n];
int indegree[n];
int q[n];
int n, m;
void toposort()
} for (k = 1; k <= n; k++)
if (map[j][k] == 1)
indegree[k]--; }}
int main()
} toposort();
printf("%d", q[1]);
for (int i = 2; i <= n; i++)
printf(" %d", q[i]);
printf("\n");
} return 0;
}
hdu4857拓撲排序
糟糕的事情發生啦,現在大家都忙著逃命。但是逃命的通道很窄,大家只能排成一行。現在有n個人,從1標號到n。同時有一些奇怪的約束條件,每個都形如 a必須在b之前。同時,社會是不平等的,這些人有的窮有的富。1號最富,2號第二富,以此類推。有錢人就賄賂負責人,所以他們有一些好處。負責人現在可以安排大家排隊的...
hdu4857 反向拓撲排序
折騰了一下午,一開始以為從1.n分別找出反向路徑進行輸出,然後就是正確的姿勢了,提交了一兩把,發現是錯的,比如下面的case 4 3 4 22 1 3 1正解應該是4 2 3 1,而我的是3 4 2 1,後面的2的位置明顯靠後,然後看了想了一下符合反向拓撲排序的規律,所以建邊的時候反著建就可以了。當...
HDU 4857 逃生 拓撲排序
time limit 1000ms memory limit 32768kb 64bit io format i64d i64udescription 糟糕的事情發生啦,現在大家都忙著逃命。但是逃命的通道很窄,大家只能排成一行。現在有n個人,從1標號到n。同時有一些奇怪的約束條件,每個都形如 a必須...