题意:判断序列是否为拓扑序列。
思路:理解什么是拓扑排序就好了,简单题。ps.这是第一次考到拓扑序列,只是简单的让我们判断一下,我觉得9月8号会考如何求一个拓扑序列,外加求关键路径!?
代码:
#include <cstdio> #include <vector> using namespace std; const int maxn=1005; vector<int> adj[maxn]; int main() { int n,m; scanf("%d%d",&n,&m); vector<int> indegree(n+1),temp; int u,v; for(int i=0;i<m;i++){ scanf("%d%d",&u,&v); adj[u].push_back(v); indegree[v]++; } int query; scanf("%d",&query); vector<int> ans; for(int i=0;i<query;i++){ bool flag=true; temp=indegree;//初始化,注意每一轮判断前都先赋值,因为每一轮都会改动结点的入度 for(int j=0;j<n;j++){ scanf("%d",&u); if(temp[u]==0 && flag){ //遍历结点u的所有出边,把相应的结点入度减1 for(int k=0;k<adj[u].size();k++) temp[adj[u][k]]--; }else{ flag=false; } } if(flag==false) ans.push_back(i); } for(int i=0;i<ans.size();i++){ printf("%d",ans[i]); if(i<ans.size()-1) printf(" "); } return 0; }