HDU 1285 确定比赛名次 (拓扑排序)

来源:互联网 发布:js中怎么删除数组元素 编辑:程序博客网 时间:2024/06/17 18:57
链接 :


http://acm.hdu.edu.cn/showproblem.php?pid=1285


拓扑排序模板 。


#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <sstream>#include <cstdio>#include <vector>#include <cmath>#include <queue>#include <stack>#include <set>#include <map>#define lson o<<1, l, m#define rson o<<1|1, m+1, r#define PII pair<int, int>#define ALL(x) x.begin(),x.end()#define mem(a) memset(a,0,sizeof(a))typedef long long ll;const double pi = acos(-1.0);const int MAX = 0x3f3f3f3f;const ll mod = 1000000007ll;const int N = 250005;using namespace std;struct C {    int ne, to;} e[N];int n, m;int du[505], he[505];void add(int id, int x, int y) {    e[id].to = y;    e[id].ne = he[x];    he[x] = id;}int main() {    //    freopen("in.txt", "r", stdin);//    freopen("out.txt", "w", stdout);        while(cin >> n >> m) {        mem(du);        memset(he, -1, sizeof(he));        for(int i = 1; i <= m; i++) {            int x, y;            scanf("%d%d", &x, &y);            du[y]++;            add(i, x, y);        }        int cnt = 0;        while(1) {            for(int i = 1; i <= n; i++) if(du[i] == 0) {                    printf("%d", i);                    cnt++;                    if(cnt < n) printf(" ");                    else {                        puts("");                        break;                    }                    du[i]--;                    for(int j = he[i]; j != -1; j = e[j].ne) {                        du[ e[j].to ]--;                    }                    break;            }            if(cnt == n) break;        }            }        return 0;    }

0 2
原创粉丝点击