题目链接:PAT【甲级】1146
题目简述:给定一个有向图,问所查询的几组序列中,不是该图的拓扑排序的是哪组。
#include<bits/stdc++.h>
using namespace std;
unordered_map<int, int> indegree;
vector<vector<int>> graph;
vector<int> ans;
int main(){
int N, M, K;
int c, c1, c2;
cin >> N >> M;
graph.resize(N + 1);
for (int i = 0; i < M;i++){
cin >> c1 >> c2;
graph[c1].push_back(c2);
indegree[c2]++;
}
cin >> K;
for (int i = 0; i < K;i++){
unordered_map<int, int> temp(indegree);
bool flag = true;
for (int j = 0; j < N;j++){
cin >> c;
if(temp[c] != 0){
flag = false;
}
else{
for (int h = 0; h < graph[c].size();h++)
temp[graph[c][h]]--;
}
}
if(!flag) ans.push_back(i);
}
cout << ans[0];
for (int i = 1; i < ans.size(); i++) cout << " " << ans[i];
return 0;
}
这道题还是挺好做的,拓扑排序就是每次选取的节点的入度必须为0.这样的话模拟一下过程就做出来了。
如果让你写一个求解给定图的所有拓扑排序序列怎么写?看这儿
#include<bits/stdc++.h>
using namespace std;
vector<vector<int>> graph, ans;
unordered_map<int, int> indegree;
vector<bool> vis;
void getAllTopuSeq(int N, vector<int> v, int t){
if(t == N){
ans.push_back(v);
return;
}
for (int i = 1; i <= N;i++){
if(!vis[i] && indegree[i] == 0){
vis[i] = true;
v.push_back(i);
for (int h = 0; h < graph[i].size();h++)
indegree[graph[i][h]]--;
getAllTopuSeq(N, v, t + 1);
vis[i] = false;
v.pop_back();
for (int h = 0; h < graph[i].size();h++)
indegree[graph[i][h]]++;
}
}
}
int main(){
//freopen("in.txt", "r", stdin);
int N, M;
int c1, c2;
cin >> N >> M;
graph.resize(N + 1);
vis.resize(N + 1);
for (int i = 0; i < M;i++){
cin >> c1 >> c2;
graph[c1].push_back(c2);
indegree[c2]++;
}
fill(vis.begin(), vis.end(), false);
getAllTopuSeq(N, vector<int>{}, 0);
for (int i = 0; i < ans.size();i++){
for (int j = 0; j < ans[i].size();j++)
cout << ans[i][j] << " ";
cout << endl;
}
return 0;
}