Submission #380979

#TimeUsernameProblemLanguageResultExecution timeMemory
380979PedroBigManRelay Marathon (NOI20_relaymarathon)C++14
100 / 100
2625 ms370884 KiB
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <string>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <deque>
#include <list>
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
typedef long double ld;
#define REP(i,a,b) for(ll i=a; i<b; i++)
#define pb push_back
#define mp make_pair
#define pl pair<ll,ll>
#define ff first
#define ss second
#define whole(x) x.begin(),x.end()
#define DEBUG(i) cout<<"Pedro Is The Master "<<i<<endl
#define INF 100000000000000000LL
ll insig;
#define In(vecBRO, LENBRO) REP(IBRO,0,LENBRO) {cin>>insig; vecBRO.pb(insig);}
void Out(vector<ll> x) {REP(i,0,x.size()) {cout<<x[i]<<" ";} cout<<endl;}

class WG //everything works for weighted directed graphs
{
    public:
    ll N; vector<vector<pl> > adj;
    vector<bool> pr; vector<ll> nv;
    
    WG(vector<vector<pl> > ad)
    {
        adj=ad; N=adj.size();
        REP(i,0,N) {pr.pb(false); nv.pb(0);}
    }
    
    void Reset()
    {
        REP(i,0,N) {pr[i]=false;nv.pb(0);}
    }
    
    vector<ll> Djikstra(ll s)
    {
        Reset();
        vector<ll> d; REP(i,0,N) {d.pb(INF);}
        d[s]=0;
        priority_queue<pl> q;
        q.push(mp(0,s));
        ll cur;
        while(!q.empty())
        {
            cur=q.top().ss; q.pop();
            if(pr[cur]) {continue;}
            pr[cur]=true; 
            REP(i,0,adj[cur].size())
            {
                if(d[adj[cur][i].ff]>d[cur]+adj[cur][i].ss)
                {
                    d[adj[cur][i].ff]=d[cur]+adj[cur][i].ss;
                    q.push(mp(-d[adj[cur][i].ff],adj[cur][i].ff));
                }
            }
        }
        return d;
    }
    
    vector<pl> Djikstra_MS(vector<ll> sn) //Djikstra Multi-sourced, ans[i].ff=d(i,sn), ans[i].ss=member of sn closest to i
    {
        Reset();
        ll K=sn.size();
        vector<pl> d; REP(i,0,N) {d.pb(mp(INF,-1LL));}
        REP(i,0,K) {d[sn[i]]=mp(0LL,sn[i]);}
        priority_queue<pl> q;
        REP(i,0,K) {q.push(mp(0,sn[i]));}
        ll cur;
        while(!q.empty())
        {
            cur=q.top().ss; q.pop();
            if(pr[cur]) {continue;}
            pr[cur]=true; 
            REP(i,0,adj[cur].size())
            {
                if(d[adj[cur][i].ff].ff>d[cur].ff+adj[cur][i].ss)
                {
                    d[adj[cur][i].ff].ff=d[cur].ff+adj[cur][i].ss;
                    d[adj[cur][i].ff].ss=d[cur].ss;
                    q.push(mp(-d[adj[cur][i].ff].ff,adj[cur][i].ff));
                }
            }
        }
        return d;
    }
};

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    ll N,M,K; cin>>N>>M>>K; vector<ll> A; vector<pl> xx; vector<vector<pl> > adj; REP(i,0,N) {adj.pb(xx);}
    pl cur; ll we;
    REP(i,0,M) {cin>>cur.ff>>cur.ss>>we; cur.ff--; cur.ss--; adj[cur.ff].pb(mp(cur.ss,we)); adj[cur.ss].pb(mp(cur.ff,we));}
    WG G(adj);
    In(A,K); REP(i,0,K) {A[i]--;}
    ll ans=INF; pl co; ll sp=INF;
    vector<pl> d=G.Djikstra_MS(A);
    REP(i,0,N)
    {
        REP(j,0,adj[i].size())
        {
            if(d[i].ss==d[adj[i][j].ff].ss) {continue;}
            if(d[i].ff+d[adj[i][j].ff].ff+adj[i][j].ss<sp)
            {
                sp=d[i].ff+d[adj[i][j].ff].ff+adj[i][j].ss;
                co=mp(d[i].ss,d[adj[i][j].ff].ss);
            }
        }
    }
    ans=sp;
    sp=INF;
    pl co2;
    A.erase(find(whole(A),co.ff));
    A.erase(find(whole(A),co.ss));
    d=G.Djikstra_MS(A);
    REP(i,0,N)
    {
        REP(j,0,adj[i].size())
        {
            if(i==co.ff || i==co.ss || adj[i][j].ff==co.ff || adj[i][j].ff==co.ss) {continue;}
            if(d[i].ss==d[adj[i][j].ff].ss) {continue;}
            if(d[i].ff+d[adj[i][j].ff].ff+adj[i][j].ss<sp)
            {
                sp=d[i].ff+d[adj[i][j].ff].ff+adj[i][j].ss;
                co2=mp(d[i].ss,d[adj[i][j].ff].ss);
            }
        }
    }
    ans+=sp;
    
    vector<ll> d1=G.Djikstra(co.ff); 
    vector<ll> d2=G.Djikstra(co.ss);
    
    ll mindist1=INF; ll par1;  ll mindist2=INF; ll par2;
    REP(j,0,K) 
    {
        ll i=A[j];
        if(i==co.ff || i==co.ss) {continue;}
        if(d1[i]<mindist1) {mindist1=d1[i]; par1=i;}
    }
    REP(j,0,K) 
    {
        ll i=A[j];
        if(i==co.ff || i==co.ss || i==par1) {continue;}
        if(d2[i]<mindist2) {mindist2=d2[i]; par2=i;}
    }
    ans=min(ans,mindist1+mindist2);
    
    mindist1=INF; mindist2=INF;
    REP(j,0,K) 
    {
        ll i=A[j];
        if(i==co.ff || i==co.ss) {continue;}
        if(d2[i]<mindist2) {mindist2=d2[i]; par2=i;}
    }
    REP(j,0,K) 
    {
        ll i=A[j];
        if(i==co.ff || i==co.ss || i==par2) {continue;}
        if(d1[i]<mindist1) {mindist1=d1[i]; par1=i;}
    }
    ans=min(ans,mindist1+mindist2);
    cout<<ans<<endl;
    return 0;
}

Compilation message (stderr)

RelayMarathon.cpp: In function 'void Out(std::vector<long long int>)':
RelayMarathon.cpp:17:33: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 | #define REP(i,a,b) for(ll i=a; i<b; i++)
......
   28 | void Out(vector<ll> x) {REP(i,0,x.size()) {cout<<x[i]<<" ";} cout<<endl;}
      |                             ~~~~~~~~~~~~
RelayMarathon.cpp:28:25: note: in expansion of macro 'REP'
   28 | void Out(vector<ll> x) {REP(i,0,x.size()) {cout<<x[i]<<" ";} cout<<endl;}
      |                         ^~~
RelayMarathon.cpp: In member function 'std::vector<long long int> WG::Djikstra(ll)':
RelayMarathon.cpp:17:33: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 | #define REP(i,a,b) for(ll i=a; i<b; i++)
......
   60 |             REP(i,0,adj[cur].size())
      |                 ~~~~~~~~~~~~~~~~~~~
RelayMarathon.cpp:60:13: note: in expansion of macro 'REP'
   60 |             REP(i,0,adj[cur].size())
      |             ^~~
RelayMarathon.cpp: In member function 'std::vector<std::pair<long long int, long long int> > WG::Djikstra_MS(std::vector<long long int>)':
RelayMarathon.cpp:17:33: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 | #define REP(i,a,b) for(ll i=a; i<b; i++)
......
   86 |             REP(i,0,adj[cur].size())
      |                 ~~~~~~~~~~~~~~~~~~~
RelayMarathon.cpp:86:13: note: in expansion of macro 'REP'
   86 |             REP(i,0,adj[cur].size())
      |             ^~~
RelayMarathon.cpp: In function 'int main()':
RelayMarathon.cpp:17:33: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 | #define REP(i,a,b) for(ll i=a; i<b; i++)
......
  113 |         REP(j,0,adj[i].size())
      |             ~~~~~~~~~~~~~~~~~    
RelayMarathon.cpp:113:9: note: in expansion of macro 'REP'
  113 |         REP(j,0,adj[i].size())
      |         ^~~
RelayMarathon.cpp:17:33: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 | #define REP(i,a,b) for(ll i=a; i<b; i++)
......
  131 |         REP(j,0,adj[i].size())
      |             ~~~~~~~~~~~~~~~~~    
RelayMarathon.cpp:131:9: note: in expansion of macro 'REP'
  131 |         REP(j,0,adj[i].size())
      |         ^~~
RelayMarathon.cpp:172:33: warning: 'par2' may be used uninitialized in this function [-Wmaybe-uninitialized]
  172 |         if(i==co.ff || i==co.ss || i==par2) {continue;}
      |            ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~
RelayMarathon.cpp:157:33: warning: 'par1' may be used uninitialized in this function [-Wmaybe-uninitialized]
  157 |         if(i==co.ff || i==co.ss || i==par1) {continue;}
      |            ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...