我先交了一份错误代码:
#include <bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
vector<pair<int,int>>G[1000005];
int dis[1000005];
bitset<1000005>vis;
bool spfa(int x){
vis[x]=1;
for(auto [nx,c]:G[x]){
if(dis[nx]>dis[x]+c){
dis[nx]=dis[x]+c;
if(vis[nx]||spfa(nx)){
vis[nx]=0;
return 1;
}
}
}
vis[x]=0;
return 0;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int T;
cin>>T;
while(T--){
int n,m,w;
cin>>n>>m>>w;
for(int i=0;i<=n;++i)G[i].clear();
for(int i=0;i<m;++i){
int x,y,z;
cin>>x>>y>>z;
G[x].push_back({y,z});
G[y].push_back({x,z});
}
for(int i=0;i<w;++i){
int x,y,z;
cin>>x>>y>>z;
G[x].push_back({y,-z});
}
for(int i=1;i<=n;++i){
memset(dis,0x3f,sizeof dis);
vis.reset();
if(spfa(i)){
cout<<"YES\n";
goto EZ;
}
}
cout<<"NO\n";
EZ:
}
return 0;
}
这份代码中在对源点跑最短路前没有对dis[i]赋初值0,但是它AC了。在负环模板题中,则WA40。
然后我加上dis[i]=0;后本题TLE74,模板题TLE90。
我不理解:
为什么加一句代码程序便会TLE?
为什么本题没给dis[i]赋初值能过、模板题则不行呢?
玄2关,thx。