HDU 1285 確定比賽名次(拓撲排序)
阿新 • • 發佈:2018-12-24
題意:共N個隊伍,給出M個比賽結果,即u和v比賽,u勝v。求最終的比賽名次,若無法確定優先的,隊伍號小的優先。
思路:裸拓撲排序。
拓撲排序:每次取入度為0的點為優先的點,取出後,刪除該點所連線的邊,重複操作直至所有點取完。
程式碼:(佇列維護可能快一些?)
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <queue>
using namespace std;
const int N = 5e2 + 10;
int edge[N][N];
int in[N];
int n, m;
int main() {
while (scanf("%d%d", &n, &m) != EOF) {
memset(edge, 0, sizeof(edge));
memset(in, 0, sizeof(in));
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
edge[u][v]++;
in[v]++;
}
bool first = true;
for (int i = 0; i < n; i++) {
int ind = -1;
for (int j = 1; j <= n; j++) {
if (in[j] == 0) {
ind = j;
break;
}
}
if (ind != -1) {
if (first)
first = false;
else
printf(" ");
printf ("%d", ind);
in[ind] = -1;
for (int j = 1; j <= n; j++) {
if (edge[ind][j]) {
in[j] -= edge[ind][j];
}
}
}
else {
return -1;
}
}
printf("\n");
}
return 0;
}