牛客5158E——(嚴格次最短路——並查集)

總結

第一步:走非最短路的路徑
兩次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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章