1146トポロジカル秩序(25分)
これは、2018年に大学院入試に与えられた問題である。与えられた有向グラフから得たトポロジカル順序ではありません次のうちどれ?今、あなたは、各オプションをテストするためのプログラムを書くことになっています。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、2つの正の整数N(≤千)、グラフの頂点の数、およびM(≤10,000)、有向辺の数を与えます。次いで、M行は、それぞれ開始及びエッジの終了頂点を与え、従います。頂点がグラフ後に1からNまで番号付けされ、K整数別の正(≤100)があります。次に、クエリのフォローのK行は、それぞれがすべての頂点の順列を与えます。行のすべての数字は、スペースで区切られます。
出力仕様:
すべての行に「NOTトポロジカル秩序」に対応したクエリのインデックスを印刷します。インデックスはゼロからのスタート。すべての数値は、スペースで区切られ、先頭または行の末尾に余分なスペースがありませんしなければなりません。少なくとも1つの答えがあることがgraranteedされます。
サンプル入力:
6 8
1 2
1 3
5 2
5 4
2 3
2 6
3 4
6 4
5
1 5 2 3 6 4
5 1 2 6 3 4
5 1 2 3 6 4
5 2 1 6 3 4
1 2 3 4 5 6
サンプル出力:
3 4
効果の件名:エッジを有向グラフのセットが指定されると、その後、あなたはトポロジカル整列を判断しないことを可能にするk個のゲノム配列を、与えます
思考:各ドットの記録の図ストレージアレイベクトルと、入次数[]配列、ARR []配列店チェックする配列
点マイナスの各点の各ループチェックポイントARR、それが0度BREAKない場合は、すべての点1
完全なコード:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
vector<int> g[1001];
int n,m,k,arr[1001],inDegree[1001];
int main(){
cin>>n>>m;
int u,v,temp[1001] = {0},res[101];
int cnt = 0;
for(int i = 0;i<m;i++){
scanf("%d%d",&u,&v);
g[u].push_back(v);
temp[v]++;
}
cin>>k;
for(int i = 0;i<k;i++){
//记得每次都要重新赋值inDegree数组
for(int j = 1;j<=n;j++){
inDegree[j] = temp[j];
}
for(int j = 1;j<=n;j++){
scanf("%d",&arr[j]);
}
for(int j = 1;j<=n;j++){
//入度不为0就不能形成拓扑排序
if(inDegree[arr[j]]!=0){
res[cnt++] = i;
break;
}
//该点指向的所有点入度减1
for(int u = 0;u<g[arr[j]].size();u++){
int v = g[arr[j]][u];
inDegree[v]--;
}
}
}
bool flag = false;
for(int i = 0;i<cnt;i++){
if(flag==false){
cout<<res[i];
flag = true;
}
else {
cout<<" "<<res[i];
}
}
return 0;
}