總結
第一步:走非最短路的路徑
兩次dijkstra
枚舉每一條邊:dis1[u]+dis+dis2[v]==dis[n]就標記,注意:標記是雙向的檢查
第二步:
並查集看所有點能否合成一顆完整的樹
題目鏈接
//#pragma GCC optimize(2)
#include<bits/stdc++.h>
//typedef long long ll;
#define ull unsigned long long
#define int long long
#define F first
#define S second
#define endl "\n"//<<flush
#define eps 1e-6
#define base 131
#define lowbit(x) (x&(-x))
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
#define MAXN 0x7fffffff
#define INF 0x3f3f3f3f3f3f3f3f
#define ferma(a,b) pow(a,b-2)
#define pb push_back
#define all(x) x.begin(),x.end()
#define memset(a,b) memset(a,b,sizeof(a));
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
void file()
{
#ifdef ONLINE_JUDGE
#else
freopen("D:/LSNU/codeforces/duipai/data.txt","r",stdin);
// freopen("D:/LSNU/codeforces/duipai/WA.txt","w",stdout);
#endif
}
const int N=1e5+5;
int dis[N][2],vis[N],fat[N];
int find(int x)
{
return fat[x]==x?x:fat[x]=find(fat[x]);
}
struct node
{
int v,dis;
};
struct e
{
int u,v,dis,tag=0;
};
vector<node>G[N];
void dijkstra(int root,int tag)
{
memset(vis,0);
dis[root][tag]=0;
priority_queue<pair<int,int> >pri;
pri.push({0,root});
while(!pri.empty())
{
pair<int,int> itt=pri.top();
pri.pop();
if(vis[itt.S])
continue;
vis[itt.S]=true;
for(auto it:G[itt.S])
{
if(vis[it.v])
continue;
if(dis[itt.S][tag]+it.dis<dis[it.v][tag])
{
dis[it.v][tag]=dis[itt.S][tag]+it.dis;
pri.push({-dis[it.v][tag],it.v});
}
}
}
}
signed main()
{
IOS;
// file();
int n,m;
cin>>n>>m;
vector<e>vec(m);
for(auto &it:vec)
{
cin>>it.u>>it.v>>it.dis;
G[it.u].pb({it.v,it.dis});
G[it.v].pb({it.u,it.dis});
}
memset(dis,INF);
dijkstra(1,0);
dijkstra(n,1);
if(dis[n][0]==INF||dis[1][1]==INF)
{
cout<<"NO"<<endl;
return 0;
}
for(auto &it:vec)
{
if(dis[it.u][0]+it.dis+dis[it.v][1]==dis[n][0])
it.tag=1;
if(dis[it.v][0]+it.dis+dis[it.u][1]==dis[n][0])
it.tag=1;
}
for(int i=1;i<=n;i++)
fat[i]=i;
for(auto it:vec)
{
int u=find(it.u);
int v=find(it.v);
if(!it.tag&&u!=v)
fat[u]=v;
}
int cnt=0;
for(int i=1;i<=n;i++)
cnt+=(i==find(i));
cout<<(cnt==1?"YES":"NO")<<endl;
return 0;
}