rt,返回 wrong answer Shortest path is not equal to 351789193 but equal to 6247796. (or exceeds 351789193),没看错的话意思是我最短路求错了,但是我尝试了输出此时的最短路得到的的确是要求的答案。
所以怀疑是哪里抽象的地方挂了,但是调不出来,求个大佬帮忙看眼。
谢谢。
#include <bits/stdc++.h>
#define int long long
#define lint __int128
#define fi first
#define se second
#define Il inline
#define Rg register
#define Ri Rg int
#define pb push_back
#define vec vector
#define IT ::iterator
#define p_que priority_queue
using namespace std;
//typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
const int N=1000,Inf=1e9;
const db eps=1e-9,pi=acos(-1.0);
int n,m,st,ed,ln,dis[N+5][2],det;
bool vis[N+5],ap[N+5][N+5];
vec<pii>v[N+5];
struct Nodj{int ps,ds;Il bool operator <(const Nodj &stmp)const{return ds>stmp.ds;}};
p_que<Nodj>dj;
Il void Dijk(){
for(Ri i=1;i<=n;i++){if(i^st)dis[i][0]=Inf;vis[i]=0;}
dj.push({st,0});
while(!dj.empty()){
int fq=dj.top().ps;dj.pop();
if(vis[fq])continue;vis[fq]=1;
for(Rg pii i:v[fq])if(dis[i.fi][0]>dis[fq][0]+(i.se?i.se:1))dis[i.fi][0]=dis[fq][0]+(i.se?i.se:1),dj.push({i.fi,dis[i.fi][0]});
}
return;
}
Il void dijk(){
for(Ri i=1;i<=n;i++){if(i^st)dis[i][1]=Inf;vis[i]=0;}
dj.push({st,0});
while(!dj.empty()){
int fq=dj.top().ps;dj.pop();
if(vis[fq])continue;vis[fq]=1;
for(Ri i=0;i<(int)v[fq].size();i++){
if(!v[fq][i].se)v[fq][i].se=dis[v[fq][i].fi][0]-dis[fq][1]+det;if(v[fq][i].se==0)v[fq][i].se=Inf;
if(v[fq][i].se>0&&dis[v[fq][i].fi][1]>dis[fq][1]+v[fq][i].se)dis[v[fq][i].fi][1]=dis[fq][1]+v[fq][i].se,dj.push({v[fq][i].fi,dis[v[fq][i].fi][1]});
}
}
return;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m>>ln>>st>>ed;st++,ed++;
for(Ri i=1;i<=m;i++){
int x,y,w;cin>>x>>y>>w;x++,y++;
v[x].pb({y,w}),v[y].pb({x,w});
}
Dijk();if(dis[ed][0]>ln){cout<<"NO";return 0;}det=ln-dis[ed][0];
dijk();if(dis[ed][1]^ln){cout<<"NO";return 0;}cout<<"YES\n";
// if(n==403){Dijk();cout<<dis[ed][0];return 0;}
for(Ri i=1;i<=n;i++)for(Rg pii j:v[i])if(j.se>0&&!ap[i][j.fi])ap[i][j.fi]=ap[j.fi][i]=1,cout<<i-1<<' '<<j.fi-1<<' '<<j.se<<'\n';
return 0;
}