#include<cstdio> //考察拓扑排序的本质!此题精通,拓扑排序无压力!
#include<queue>
#include<stack>
#include<vector>
using namespace std;
const int maxn=1010;
int n,m,k;
vector<int> v[maxn];
int indegree[maxn]={0},tmpdegree[maxn]={0};
void copy(){
for(int i=1;i<=n;i++){
tmpdegree[i]=indegree[i]; //每次测试都要修改出入度函数,然而不止一组测试!
// printf(" %d-",indegree[i]);
}
}
bool istopo(int num[]){ //此题核心:顺序遍历结点并判断入度是否为0,不为0则不为拓扑序列!
for(int i=0;i<n;i++){ //依次删除其有向边之后,如果下一层结点依旧存在入度边则说明还遗留有上一层结点
int p=num[i]; //没有依次排序,该序列不为拓扑序列!!
// printf("--%d %d-- ",p,tmpdegree[p]);
if(tmpdegree[p]==0){
for(int i=0;i<v[p].size();i++){
int tmp=v[p][i];
// printf(" --%d%d%d-- ",tmpdegree[tmp],tmp,p);
tmpdegree[tmp]--;
}
} else
return false;
}
return true;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
int a,b;
scanf("%d%d",&a,&b);
v[a].push_back(b); //基本点:利用向量存有向图各个起点所指向的终点!
indegree[b]++; //基本点:利用数组记录终点的入度!
}
// for(int f=1;f<=n;f++){
// printf(" %d ",indegree[f]);
// }
scanf("%d",&k);
int order=0,quan=0,ans[105]={0};
for(int i=0;i<k;i++){
copy();
// for(int f=0;f<n;f++){
// printf(" %d ",tmpdegree[f]);
// }
int num[n]={0};
for(int j=0;j<n;j++){
scanf("%d",&num[j]);
}
if(!istopo(num)){
ans[quan++]=i; //基本点:利用数组记录结果!!
}
}
for(int i=0;i<quan;i++){
printf("%d",ans[i]);
if(i!=quan-1) printf(" ");
}
return 0;
}
1146 Topological Order (25)
最新推荐文章于 2024-07-25 12:55:52 发布