题目描述
知识点
拓扑排序
实现
码前思考
- 模拟拓扑排序题,没啥讲的
代码实现
//是否要判断本身是否为有向无环图?不用!
//结点标号是从1开始的
#include "bits/stdc++.h"
using namespace std;
const int maxn = 1e3+10;
int n;
int m;
int k;
int main(){
scanf("%d %d",&n,&m);
vector<vector<int>> adj(n+1);
vector<int> inDegree(n+1,0);
for(int i=0;i<m;i++){
int start;
int end;
scanf("%d %d",&start,&end);
adj[start].push_back(end);
inDegree[end]++;
}
scanf("%d",&k);
vector<int> ans;
for(int i=0;i<k;i++){
vector<int> tmp = inDegree;
bool flag = true;
for(int j=0;j<n;j++){
int cur;
scanf("%d",&cur);
if(tmp[cur] != 0){
flag = false;
break;
}else{
for(int k=0;k<adj[cur].size();k++){
tmp[adj[cur][k]]--;
}
}
}
if(flag == false){
ans.push_back(i);
string str;
//吸收
getline(cin,str);
}
}
for(int i=0;i<ans.size();i++){
printf("%d",ans[i]);
if(i!=ans.size()-1){
printf(" ");
}
}
return 0;
}
码后反思
无
二刷代码
第二次写这道题目的时候,我想偷懒,选了给每一个点赋予一个权值这样的方式,结果没有通过题目!!!我认为原因在于输出的时候,其实第三层的可能比第二层的早输出,因为第二层这个元素可能并没有连接到任何的第三层元素!!!
第三次写还是差点思考错了,还是孤立点那个问题:
#include <iostream>
#include <vector>
//#include <set>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 1e3+10;
const int maxm = 1e4+10;
int indegree[maxn];
int degree[maxn];
vector<int> adj[maxn];
vector<int> query;
vector<int> res;
int n,m,k;
bool topo(){
for(int i=0;i<maxn;i++){
degree[i]=indegree[i];
}
//得到每一层的数字
// set<int> st;
// queue<int> q;
// for(int i=1;i<=n;i++){
// if(degree[i]==0){
// st.insert(i);
// q.push(i);
// }
// }
for(int i=0;i<query.size();i++){
int u=query[i];
if(degree[u]!=0){
return false;
}else{
for(int j=0;j<adj[u].size();j++){
int v=adj[u][j];
degree[v]--;
}
}
}
return true;
}
int main(){
scanf("%d %d",&n,&m);
fill(indegree,indegree+maxn,0);
fill(adj,adj+maxn,vector<int>(0));
for(int i=0;i<m;i++){
int u,v;
scanf("%d %d",&u,&v);
adj[u].push_back(v);
indegree[v]++;
}
scanf("%d",&k);
//接下来进行拓扑排序验证
for(int i=0;i<k;i++){
query.clear();
for(int j=0;j<n;j++){
int tmp;
scanf("%d",&tmp);
query.push_back(tmp);
}
int flag=topo();
if(!flag){
res.push_back(i);
}
}
for(int i=0;i<res.size();i++){
printf("%d%c",res[i],i==res.size()-1?'\n':' ');
}
return 0;
}