第一遍全用定长数组,没通过
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
#define MAXN 1010
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
#endif
int n,m;
cin>>n>>m;
int v[MAXN][MAXN]={},cnt1[MAXN]={};
for(int i=0;i<m;i++){
int start,end;
cin>>start>>end;
v[start][end]=1;
cnt1[end]++;
}
int k;
cin>>k;
vector<int> ans;
for(int i=0;i<k;i++){
int flag=1;
int cnt[MAXN]={};
memcpy(cnt,cnt1,sizeof(int)*MAXN);
for(int j=0;j<n;j++){
int temp;
cin>>temp;
if(cnt[temp]!=0){
flag=0;
break;
}else{
for(int t=0;t<n;t++){
if(v[temp][t+1]==1){
cnt[t+1]--;
}
}
}
}
if(flag==1){
ans.push_back(i);
}
}
for(int p=0;p<ans.size();p++){
if(p==0){
cout<<ans[p];
}else{
cout<<' '<<ans[p];
}
}
cout<<endl;
return 0;
}
第二次将定长数组改成vector,只能得到5分(通过第三和第四个测试点)
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
#define MAXN 1010
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
#endif
int n,m;
cin>>n>>m;
vector<int> v[MAXN];
int cnt1[MAXN]={};
for(int i=0;i<m;i++){
int start,end;
cin>>start>>end;
v[start].push_back(end);
cnt1[end]++;
}
int k;
cin>>k;
vector<int> ans;
for(int i=0;i<k;i++){
int flag=1;
int cnt[MAXN]={};
memcpy(cnt,cnt1,sizeof(int)*MAXN);
for(int j=0;j<n;j++){
int temp;
cin>>temp;
if(cnt[temp]!=0){
flag=0;
break;
}else{
for(int t=0;t<v[temp].size();t++){
cnt[v[temp][t]]--;
}
}
}
if(flag==0){
ans.push_back(i);
}
}
for(int p=0;p<ans.size();p++){
if(p==0){
cout<<ans[p];
}else{
cout<<' '<<ans[p];
}
}
cout<<endl;
return 0;
}
第三次把判断拓扑的部分单独写成函数就能AC
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
#define MAXN 1010
vector<int> v[MAXN];
bool istopol(vector<int> arr, int a[]){
for(int i=0;i<arr.size();i++){
if(a[arr[i]]!=0){
return false;
}else{
for(int t=0;t<v[arr[i]].size();t++){
a[v[arr[i]][t]]--;
}
}
}
return true;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
#endif
int n,m;
cin>>n>>m;
int cnt1[MAXN]={};
for(int i=0;i<m;i++){
int start,end;
cin>>start>>end;
v[start].push_back(end);
cnt1[end]++;
}
int k;
cin>>k;
vector<int> ans;
for(int i=0;i<k;i++){
int cnt[MAXN]={};
memcpy(cnt,cnt1,sizeof(int)*MAXN);
vector<int> arr;
for(int j=0;j<n;j++){
int temp;
cin>>temp;
arr.push_back(temp);
}
if(!istopol(arr,cnt)){
ans.push_back(i);
}
}
for(int p=0;p<ans.size();p++){
if(p==0){
cout<<ans[p];
}else{
cout<<' '<<ans[p];
}
}
cout<<endl;
return 0;
}
跪求大佬说一下原因??