1146 토폴로지 주문 (25 分)
이는 2018 년 대학원 입학 시험에 주어진 문제입니다 : 다음 중 주어진 방향 그래프에서 얻은 위상 순서 아닌가요? 이제 당신은 각 옵션을 테스트하는 프로그램을 작성하기로되어있다.
입력 사양 :
각 입력 파일은 하나의 테스트 케이스가 포함되어 있습니다. 각 경우에있어서, 첫 번째 행은 두 양의 정수 N (≤ 1000), 그래프의 정점의 수, M (≤ 10,000), 방향 에지의 개수를 제공한다. 그런 다음 M 라인은 각각의 시작과 끝의 마지막 정점을 제공하십시오. 정점은 K의 정수 다른 양극 (≤ 100)가 그래프 후 1 내지 N 번째된다. 그런 다음 쿼리 추적의 K 라인은 각각의 모든 정점의 순열을 제공합니다. 라인의 모든 번호는 공백으로 구분된다.
출력 사양 :
모든 라인에 "NOT 토폴로지 순서"에 해당 쿼리의 인덱스를 인쇄합니다. 인덱스는 0부터 시작합니다. 모든 숫자는 공백으로 구분하고있다가 반드시 별도의 시작 부분에 공백이나 줄의 끝. 적어도 하나 개의 해답이 있음을 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 게놈 시퀀스의 설정,
생각 : 도 스토리지 어레이 벡터로하면, inDegree [각 도트의 기록의 배열을 확인하는 [] 배열을 저장 순서, 언
이 0도 BREAK가 아닌 경우, 점 빼기 (1)의 각 지점의 모든 포인트를 각 루프 체크 포인트를 ARR
전체 코드 :
#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;
}