最后2个点死活过去不
#include<bits/stdc++.h>
#define int __int128
#define ll long long
using namespace std;
const int maxn=2e5+9;
struct node
{
int v,w;
};
struct edge
{
int u,v,w;
};
vector<node>G[maxn];
vector<edge>g;
void add(int u,int v,int w)
{
G[u].push_back({v,w});
G[v].push_back({u,w});
g.push_back({u,v,w});
}
bool vis[maxn];
struct NODE
{
int dis,u;
bool operator<(const NODE &you)const
{
return dis>you.dis;
}
};
int cnt1[maxn];
int dis1[maxn];
int disn[maxn];
int cntn[maxn];
ll n,m;
void dij(int s,int dis[],int cnt[])
{
for(int i=1;i<=n;i++)dis[i]=1e18;
memset(vis,false,sizeof(vis));
cnt[s]=1;
dis[s]=0;
priority_queue<NODE>q;
q.push({0,s});
while(!q.empty())
{
int u=q.top().u;
q.pop();
if(vis[u])continue;
vis[u]=true;
for(auto it:G[u])
{
int v=it.v,w=it.w;
if(dis[u]+w==dis[v])
{
cnt[v]+=cnt[u];
}
if(dis[u]+w<dis[v])
{
cnt[v]=cnt[u];
dis[v]=dis[u]+w;
q.push({dis[v],v});
}
}
}
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
ll u,v,w;
cin>>u>>v>>w;
add(u,v,w);
}
dij(1,dis1,cnt1);
dij(n,disn,cntn);
// for(int i=1;i<=n;i++)cout<<cnt1[i]<<" ";
// cout<<endl;
for(auto it:g)
{
int u=it.u,v=it.v,w=it.w;
if(dis1[u]+w+disn[v]==dis1[n]&&cnt1[u]*cntn[v]==cnt1[n])
{
cout<<"Yes\n";
continue;
}
swap(u,v);
if(dis1[u]+w+disn[v]==dis1[n]&&cnt1[u]*cntn[v]==cnt1[n])
{
cout<<"Yes\n";
continue;
}
cout<<"No\n";
}
return 0;
}