下面的代码会 TLE(flag以状态压缩的形式表示每个点是否访问过)
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,in[100005];
bool e[100005];
vector<int> go[100005];
queue<int> q[2];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>e[i];
for(int i=1;i<=m;i++){
cin>>x>>y;
go[x+1].push_back(y+1);
in[y+1]++;
}
for(int i=1;i<=n;i++)
if(in[i]==0) q[e[i]].push(i);
int flag=(1<<n)-1,cnt=0;
while(flag){
cnt++;
while(!q[0].empty()){
int f=q[0].front();
flag-=(1<<(f-1));
q[0].pop();
int si=go[f].size();
for(int i=0;i<si;i++){
in[go[f][i]]--;
if(!in[go[f][i]])
q[e[go[f][i]]].push(go[f][i]);
}
}
while(!q[1].empty()){
int f=q[1].front();
flag-=(1<<(f-1));
q[1].pop();
int si=go[f].size();
for(int i=0;i<si;i++){
in[go[f][i]]--;
if(!in[go[f][i]])
q[e[go[f][i]]].push(go[f][i]);
}
}
}
cout<<cnt<<endl;
return 0;
}
而这个代码不会(直接用q.empty()判断是否还有点)
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,in[100005],e[100005];
vector<int> go[100005];
queue<int> q[2];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&e[i]);
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
go[x+1].push_back(y+1);
in[y+1]++;
}
for(int i=1;i<=n;i++)
if(in[i]==0) q[e[i]].push(i);
int cnt=0;
while(!q[0].empty()||!q[1].empty()){
while(!q[0].empty()){
int f=q[0].front();
q[0].pop();
int si=go[f].size();
for(int i=0;i<si;i++){
in[go[f][i]]--;
if(!in[go[f][i]])
q[e[go[f][i]]].push(go[f][i]);
}
}
if(!q[1].empty()) cnt++;
while(!q[1].empty()){
int f=q[1].front();
q[1].pop();
int si=go[f].size();
for(int i=0;i<si;i++){
in[go[f][i]]--;
if(!in[go[f][i]])
q[e[go[f][i]]].push(go[f][i]);
}
}
}
printf("%d\n",cnt);
return 0;
}
求大佬指点,为什么第一个代码会TLE Thanks♪(・ω・)ノ