拓撲排序簡單題__HDU

來源:互聯網
上載者:User
確定比賽名次

題目傳送:HDU - 1285 - 確定比賽名次

思路:拓撲排序

AC代碼①(遍曆找最小字典序):

#include <map>#include <set>#include <cmath>#include <deque>#include <queue>#include <stack>#include <cstdio>#include <cctype>#include <string>#include <vector>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define INF 0x7fffffffusing namespace std;int n, m;int mp[505][505];int deg[505];void topo_sort() {    for(int i = 1; i <= n; i ++) {        for(int j = 1; j <= n; j ++) {            if(deg[j] == 0) {                deg[j] --;                if(i != n) cout << j << " ";                else cout << j << endl;                for(int k = 1; k <= n; k ++) {                    if(mp[j][k] == 1) {                        deg[k] --;                    }                }                break;            }        }    }}int main() {    while(scanf("%d %d", &n, &m) != EOF) {        memset(mp, 0, sizeof(mp));        memset(deg, 0, sizeof(deg));        int u, v;        for(int i = 0; i < m; i ++) {            scanf("%d %d", &u, &v);            if(!mp[u][v]) {//注意這裡一個隊可能贏一個隊多場                 mp[u][v] = 1;                deg[v] ++;            }        }        topo_sort();    }    return 0;}

AC代碼②(優先隊列找最小字典序):

#include <map>#include <set>#include <cmath>#include <deque>#include <queue>#include <stack>#include <cstdio>#include <cctype>#include <string>#include <vector>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define INF 0x7fffffffusing namespace std;int n, m;int deg[505];int mp[505][505];int topo[505];int cnt;void bfs() {    priority_queue<int, vector<int>, greater<int> > q;//最小堆,因為預設為最大堆,可以通過greater來設定為最小堆     for(int i = 1; i <= n; i ++) {        if(deg[i] == 0) {            q.push(i);        }    }    while(!q.empty()) {        int t = q.top();        q.pop();        topo[cnt ++] = t;        for(int i = 1; i <= n; i ++) {            if(mp[t][i]) {                deg[i] --;                if(deg[i] == 0) q.push(i);                mp[t][i] = 0;//刪邊             }        }    }}int main() {    while(scanf("%d %d", &n, &m) != EOF) {        memset(deg, 0, sizeof(deg));        int u, v;        for(int i = 0; i < m; i ++) {            scanf("%d %d", &u, &v);            if(!mp[u][v]) {//注意這裡一個隊可能贏一個隊多場                 mp[u][v] = 1;                deg[v] ++;            }        }        cnt = 0;        bfs();        for(int i = 0; i < cnt - 1; i ++) {            printf("%d ", topo[i]);        }        printf("%d\n", topo[cnt - 1]);    }    return 0; }


產生冠軍

題目傳送:HDU - 2094 - 產生冠軍

思路:因為只要確定是否產生冠軍,根據題意可以得知若且唯若入度為0的只有一個時可以產生冠軍,可以用map來映射儲存的人的名字

AC代碼:

#include <map>#include <set>#include <cmath>#include <deque>#include <queue>#include <stack>#include <cstdio>#include <cctype>#include <string>#include <vector>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define INF 0x7fffffffusing namespace std;map<string, int> mp;int deg[1005];int cnt;int n;int main() {    while(scanf("%d", &n) != EOF) {        if(n == 0) break;        memset(deg, 0, sizeof(deg));        cnt = 1;        mp.clear();        string s1, s2;        for(int i = 0; i < n; i ++) {            cin >> s1 >> s2;//          cout << s1 << " " << s2 << endl;            if(mp.find(s1) == mp.end()) {                mp[s1] = cnt ++;            }            if(mp.find(s2) == mp.end()) {                mp[s2] = cnt ++;            }            int t1 = mp[s1];            int t2 = mp[s2];            deg[mp[s2]] ++;        }        int sum = 0;        for(int i = 1; i < cnt; i ++) {            if(deg[i] == 0) {                sum ++;            }        }        if(sum == 1) {            printf("Yes\n");        }        else printf("No\n");    }    return 0;}


Reward

題目傳送:HDU - 2647 - Reward

思路:拓撲排序,倒著往前推,即把u->v的邊在建圖的時候看成v->u。

AC代碼:

#include <map>#include <set>#include <cmath>#include <deque>#include <queue>#include <stack>#include <cstdio>#include <cctype>#include <string>#include <vector>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define INF 0x7fffffffusing namespace std;const int maxn = 10005;int n, m;int sum, ans;struct node {    int x, p;    node() {}    node(int _x, int _p) : x(_x), p(_p) {}}; vector<int> mp[maxn];int deg[maxn];void topo() {    queue<node> que;    for(int i = 1; i <=n; i ++) {        if(deg[i] == 0) {            que.push(node(i, 888));            sum --;            ans += 888;        }    }    while(!que.empty()) {        node t = que.front();        que.pop();        int d = mp[t.x].size();        for(int i = 0; i < d; i ++) {            deg[mp[t.x][i]] --;            if(deg[mp[t.x][i]] == 0) {                sum --;                ans += t.p + 1;                que.push(node(mp[t.x][i], t.p + 1));            }        }    }}int main() {    while(scanf("%d %d", &n, &m) != EOF) {        memset(deg, 0, sizeof(deg));        for(int i = 1; i <= n; i ++) {//居然忘記初始化WA了,╮(╯▽╰)╭             mp[i].clear();        }        int u, v;        for(int i = 0; i < m; i ++) {            scanf("%d %d", &u, &v);            mp[v].push_back(u);            deg[u] ++;        }        sum = n;        ans = 0;        topo();        if(sum <= 0) {            printf("%d\n", ans);        }        else printf("-1\n");    }    return 0;}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.