HihoCoder - 1174 拓扑排序·一
由于今天上課的老師講的特別無聊,小Hi和小Ho偷偷地聊了起來。
小Ho:小Hi,你這學(xué)期有選什么課么?
小Hi:挺多的,比如XXX1,XXX2還有XXX3。本來想選YYY2的,但是好像沒有先選過YYY1,不能選YYY2。
小Ho:先修課程真是個(gè)麻煩的東西呢。
小Hi:沒錯(cuò)呢。好多課程都有先修課程,每次選課之前都得先查查有沒有先修。教務(wù)公布的先修課程記錄都是好多年前的,不但有重復(fù)的信息,好像很多都不正確了。
小Ho:課程太多了,教務(wù)也沒法整理吧。他們也沒法一個(gè)一個(gè)確認(rèn)有沒有寫錯(cuò)。
小Hi:這不正是輪到小Ho你出馬的時(shí)候了么!
小Ho:哎??
我們都知道大學(xué)的課程是可以自己選擇的,每一個(gè)學(xué)期可以自由選擇打算學(xué)習(xí)的課程。唯一限制我們選課是一些課程之間的順序關(guān)系:有的難度很大的課程可能會(huì)有一些前置課程的要求。比如課程A是課程B的前置課程,則要求先學(xué)習(xí)完A課程,才可以選擇B課程。大學(xué)的教務(wù)收集了所有課程的順序關(guān)系,但由于系統(tǒng)故障,可能有一些信息出現(xiàn)了錯(cuò)誤。現(xiàn)在小Ho把信息都告訴你,請(qǐng)你幫小Ho判斷一下這些信息是否有誤。錯(cuò)誤的信息主要是指出現(xiàn)了"課程A是課程B的前置課程,同時(shí)課程B也是課程A的前置課程"這樣的情況。當(dāng)然"課程A是課程B的前置課程,課程B是課程C的前置課程,課程C是課程A的前置課程"這類也是錯(cuò)誤的。
提示:拓?fù)渑判?/p>
輸入
第1行:1個(gè)整數(shù)T,表示數(shù)據(jù)的組數(shù)T(1 <= T <= 5)
接下來T組數(shù)據(jù)按照以下格式:
第1行:2個(gè)整數(shù),N,M。N表示課程總數(shù)量,課程編號(hào)為1..N。M表示順序關(guān)系的數(shù)量。1 <= N <= 100,000. 1 <= M <= 500,000
第2..M+1行:每行2個(gè)整數(shù),A,B。表示課程A是課程B的前置課程。
輸出
第1..T行:每行1個(gè)字符串,若該組信息無誤,輸出"Correct",若該組信息有誤,輸出"Wrong"。
樣例輸入
2 2 2 1 2 2 1 3 2 1 2 1 3樣例輸出
Wrong Correct #include <cstdio> #include <iostream> #include <string> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <map> #include <vector> using namespace std; #define ll long longvector<int>to[100000+8]; queue<int>q; priority_queue<int, vector<int>, greater<int> >you;int n, m, t, in[1000000+8], sign[1000000+8], du[1000000+8], si[1000000+8];int get(int miao) {for(int i = 0; i <= miao; i++){du[i] = in[i];si[i] = sign[i];}int num = miao;while(!q.empty()){int t = q.front();num--;q.pop();for(int i = 0; i<to[t].size(); i++){du[to[t][i]]--;if(!du[to[t][i]] && !si[to[t][i]]){q.push(to[t][i]);si[to[t][i]] = 1;}}}return num; }int main() {int a, b;for(scanf("%d", &t);t--;){memset(in, 0, sizeof(in));memset(sign, 0, sizeof(sign));for(int i = 0; i <= n; i++)to[i].clear();scanf("%d%d", &n, &m);for(int i = 0; i<m; i++){scanf("%d%d", &a, &b);to[a].push_back(b);in[b]++;}for(int i = 1; i <= n; i++){if(!in[i] && !sign[i]){q.push(i);you.push(i);sign[i] = 1;}}if(get(n) == 0)printf("Correct\n");else printf("Wrong\n");}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/RootVount/p/11201113.html
總結(jié)
以上是生活随笔為你收集整理的HihoCoder - 1174 拓扑排序·一的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python定义点击右上角关闭按钮事件
- 下一篇: [Vuex系列] - Module的用法