WA on #16 求调
查看原帖
WA on #16 求调
807774
_Wind_Leaves_ShaDow_楼主2024/10/14 18:37

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;
} 
2024/10/14 18:37
加载中...