PAT甲级1146
题目大意:给出一个有向图,然后给出k组数据,判断是否能构成拓扑序。
开辟indegree数组保存每个节点的入度,判断时候额外复制一个数组处理,不要在原数组上修改。每输入一个顶点就判断其是否入度为0,如果不为0标记false,之后输入的数据不做任何处理,并且保存该组数据的编号;如果为0则将这个顶点指向的顶点入度减1.最后输出所有不能拓扑的下标。
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#define MAXN 1005
using namespace std;
int graph[MAXN][MAXN];
int main(){
int n,m,v1,v2,k,tmp;
bool flag;
scanf("%d%d",&n,&m);
vector<int> indegree(n+1,0),tmpindegree,ans;
for(int i=1;i<=n;i++)
fill(graph[i],graph[i]+n+1,0);
for(int i=0;i<m;i++){
scanf("%d%d",&v1,&v2);
graph[v1][v2]=1;
indegree[v2]++;
}
scanf("%d",&k);
for(int i=0;i<k;i++){
flag=true;
tmpindegree=indegree;
for(int j=0;j<n;j++){
scanf("%d",&tmp);
if(flag&&j!=n-1){
if(tmpindegree[tmp]!=0){
flag=false;
ans.push_back(i);
}else{
for(int k=1;k<=n;k++){
if(graph[tmp][k]>0) tmpindegree[k]--;
}
}
}
}
}
for(int i=0;i<ans.size();i++){
if(i!=0) printf(" ");
printf("%d",ans[i]);
}
system("pause");
return 0;
}