1. 程式人生 > >HDU 1285 確定比賽名次(拓撲排序)

HDU 1285 確定比賽名次(拓撲排序)

題意:共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; }