以下是我的错误代码,
在写的时候遇到两个问题,一个是表示拓扑关系的g数组是循环使用的,二是装前驱节点的集合set也是循环使用的。
可是第一轮就把他清空了,所有之后的询问不用判断就是正确的,卡了我半天。
//
// Created by HP on 2020/9/6.
//
#include <iostream>
#include <vector>
#include <set>
using namespace std;
set<int> s[1010];
int g[1010][1010];
int main(){
int n,m;
int start,end;
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>start>>end;
s[end].insert(start);//s记录node还有没有前驱节点
g[start][end]=1;
}
int k;
cin>>k;
vector<int > ans;
for(int i=1;i<=k;i++){
set<int> temp[n+1];
for(int i=1;i<=n;i++){
for(auto it:s[i])temp[i].insert(it);
}
int node;
int flag = 0;
for(int j=0;j<n;j++){
cin>>node;
if(temp[node].size()!=0){
flag=1;
break;
}
else {
for(int l=1;l<=n;l++){ //遍历所有的节点,如果有以他为前驱节点的点,那么删掉这个点就行了
if(g[node][l]==1){
// g[node][l]=0;
temp[l].erase(node);//你不能直接把set清空了,因为下一轮询问还要用到
// printf("%d -> %d deleted!\n",node,l);
}
}
}
}
if(flag){
ans.push_back(i-1);
// cout<<i<<endl;
}
}
if(ans.size()==0)return 0;
else cout<<ans[0];
for(int i=1;i<ans.size();i++){
cout<<' '<<ans[i];
}
cout<<endl;
}
取消set,直接用in数组表示入度的错误版本
//
// Created by HP on 2020/9/6.
//
#include <iostream>
#include <vector>
#include <set>
using namespace std;
set<int> s[1010];
int g[1010][1010];
int in[1010];
vector<int> v[1010];
int main(){
int n,m;
int start,end;
cin>>n>>m;
// in.resize(n+1);
for(int i=0;i<m;i++){
cin>>start>>end;
in[end]++; //入度
v[end].push_back(start); //记录前驱节点
g[start][end]=1;
}
int k;
cin>>k;
vector<int > ans;
for(int i=1;i<=k;i++){
vector<int> temp_in(in,in+n+1); //把入度数组复制到容器里
int node;
int flag = 0;
for(int j=0;j<n;j++){
cin>>node;
if(!temp_in[node]){ //如果入度不为0
flag=1;
break;
}
else { //合法情况下
for(int l =1;l<=n;l++){
if(g[node][l]){
temp_in[l]--;
}
}
}
}
if(flag){
ans.push_back(i);
// cout<<i<<endl;
}
}
if(ans.size()==0)return 0;
else cout<<ans[0];
for(int i=1;i<ans.size();i++){
cout<<' '<<ans[i];
}
cout<<endl;
}
v数组记录后驱节点的正确版本(浒鱼鱼)
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m, a, b, k, flag = 0, in[1010];
vector<int> v[1010];
scanf("%d %d", &n, &m);
for (int i = 0; i < m; i++) {
scanf("%d %d", &a, &b);
v[a].push_back(b);
in[b]++;
}
scanf("%d", &k);
for (int i = 0; i < k; i++) {
int judge = 1;
vector<int> tin(in, in+n+1);
for (int j = 0; j < n; j++) {
scanf("%d", &a);
if (tin[a] != 0) judge = 0;
for (int it : v[a]) tin[it]--;
}
if (judge == 1) continue;
printf("%s%d", flag == 1 ? " ": "", i);
flag = 1;
}
return 0;
}
这个版本提交能通过,但是我用clion是过不了样例的,而且不懂为什么最后输出的是i不是i+1,indices不是从1开始编号的吗。
太恶心了,浪费两个小时,以后有机会还是转行吧,计算机真不适合我,转不过弯来