제출 #584692

#제출 시각아이디문제언어결과실행 시간메모리
584692FuelTheBurnCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
393 ms24032 KiB
#include <bits/stdc++.h>
using namespace std;

void setIO(string s) {
    ios_base::sync_with_stdio(0); cin.tie(0); 
    freopen((s+".in").c_str(),"r",stdin);
    freopen((s+".out").c_str(),"w",stdout);
}

using ll = long long;
using ld = long double;
using db = double;
using str = string;

typedef long long ll;
typedef vector<ll> vl; 
typedef vector<pair<ll,ll>> vpl; 
 
#define FOR(i,a,b) for (int i = (a); i < (b); ++i)
#define F0R(i,a) FOR(i,0,a)
#define ROF(i,a,b) for (int i = (b)-1; i >= (a); --i)
#define R0F(i,a) ROF(i,0,a)
#define trav(a,x) for (auto& a: x) //will not work for bool
#define travBool(a,x) for (auto a: x)
#define print(x) trav(a,x){cout<<a<<" ";}cout<<endl; //will not work for bool
#define printBool(x) travBool(a,x){cout<<a<<" ";}cout<<endl;
#define print2d(x) trav(a,x){trav(b,a){cout<<b<<" ";}cout<<endl;}
#define doPrefixSum2d(data, prefixSum,x,y){prefixSum.resize(x,vector<ll>(y,0));F0R(i,x){prefixSum[i][0]=0;}F0R(j,y){prefixSum[0][j]=0;}FOR(i,1,x){FOR(j,1,y){prefixSum[i][j]=data[i][j]+prefixSum[i-1][j]+prefixSum[i][j-1]-prefixSum[i-1][j-1];}}}//x and y are the size of prefixSum and data including the first row of 0s
#define printQueue(q){auto copyOfQ=q;if(copyOfQ.empty()){cout<<"empty";}while(!copyOfQ.empty()){cout<<copyOfQ.front()<<" ";copyOfQ.pop();}cout<<endl;}

#define pb push_back
#define rsz resize
#define sz(x) int(x.size())
#define all(x) begin(x), end(x)
#define f first
#define s second

const int MOD = 1e9+7; // 998244353;
const int MX = 2e5+5;
const ll INF = 1e18; // not too close to LLONG_MAX
const ld PI = acos((ld)-1);

bool ysort(const pair<ll,ll>& x, const pair<ll,ll>& y){
    return x.s<y.s;
}

ll findSum2d(vector<vector<ll>>& prefixSum,ll bx,ll by,ll ex,ll ey){
    return(prefixSum[ex][ey]-prefixSum[bx-1][ey]-prefixSum[ex][by-1]+prefixSum[bx-1][by-1]);
}//all 4 cords are inclusive

struct DSU {
    vector<int> e;
    DSU(int N) { e = vector<int>(N, -1); }

    // get representive component (uses path compression)
    int get(int x) { return e[x] < 0 ? x : e[x] = get(e[x]); }

    bool same_set(int a, int b) { return get(a) == get(b); }

    int size(int x) { return -e[get(x)]; }

    bool unite(int x, int y) {  // union by size, you can change this to return the new leader
        x = get(x), y = get(y);
        if (x == y) return false;
        if (e[x] > e[y]) swap(x, y);
        e[x] += e[y]; e[y] = x; return true;
    }
    void printDSU(){
        print(e);
    }
};

ll N=0;
ll M=0;
ll S=0,T=0,U=0,V=0;
ll ans=INF;
vector<vector<pair<ll,ll>>> adjList;//0 index
vector<pair<ll,pair<ll,pair<ll,ll>>>> dist;//dist,prev,least,greatest 
priority_queue<pair<ll,ll>> pq;
vector<ll> UDist;
vector<ll> VDist;
//check for fail case? is there a gaurantee of success? go re read the problem self when u feel like it

int main(){
    //setIO("fcolor");
    cin>>N;
    //cout<<"HI"<<endl;
    //cout<<N<<endl;
    cin>>M;//goes from S to T not N to M
    cin>>S;
    cin>>T;
    cin>>U;
    cin>>V;
    S--;
    T--;
    U--;
    V--;//0 index
    adjList.rsz(N);
    //dist.rsz(N,{INF,{vector<ll>(1,1),{INF,0}}});
    dist.rsz(N);
    UDist.rsz(N,INF);
    VDist.rsz(N,INF);
    trav(a,dist){
        a.f=INF;
        a.s.f=INF;
        a.s.s.f=INF;
        a.s.s.s=INF;
    }
    F0R(i,M)
    {
        ll a=0;
        ll b=0;
        ll c=0;
        cin>>a>>b>>c;
        adjList[a-1].pb({b-1,c});
        adjList[b-1].pb({a-1,c});
    }
    

    UDist[U]=0;
    pq.push({0,U});
    while(pq.size()){
        //cout<<"boom"<<endl;
        ll x=pq.top().s;
        ll d=pq.top().f;
        pq.pop();
        if(-d!=UDist[x])continue;
        trav(a,adjList[x]){
            if(UDist[a.f]>UDist[x]+a.s){
                UDist[a.f]=UDist[x]+a.s;
                pq.push({-UDist[a.f],a.f});
            }
        }
    }
    //cout<<"UDist"<<endl;
    //print(UDist);

    VDist[V]=0;
    pq.push({0,V});
    while(pq.size()){
        //cout<<"boom"<<endl;
        ll x=pq.top().s;
        //cout<<x<<endl;
        ll d=pq.top().f;
        pq.pop();
        if(-d!=VDist[x])continue;
        trav(a,adjList[x]){
            if(VDist[a.f]>VDist[x]+a.s){
                VDist[a.f]=VDist[x]+a.s;
                pq.push({-VDist[a.f],a.f});
            }
        }
    }

    //cout<<"VDist"<<endl;
    //print(VDist);
    dist[S]={0,{UDist[S]+VDist[S],{UDist[S],VDist[S]}}};
    pq.push({0,S});
    while(pq.size()){

        ll x=pq.top().s;
        ll d=pq.top().f;
        pq.pop();
        if(-d!=dist[x].f)continue;
        //cout<<"x: "<<x<<endl;
        trav(a,adjList[x]){
            if(dist[a.f].f>=dist[x].f+a.s){
                if(dist[a.f].f==dist[x].f+a.s){
                    
                    dist[a.f].s.s.f=min(UDist[a.f],min(dist[x].s.s.f,dist[a.f].s.s.f));
                    dist[a.f].s.s.s=min(VDist[a.f],min(dist[x].s.s.s,dist[a.f].s.s.s));
                    dist[a.f].s.f=min(min(dist[x].s.f,dist[a.f].s.f),min(dist[a.f].s.s.f+VDist[a.f],dist[a.f].s.s.s+UDist[a.f]));
                }//fix this

                else{
                    dist[a.f].f=dist[x].f+a.s;
                    dist[a.f].s.s.f=min(UDist[a.f],dist[x].s.s.f);
                    dist[a.f].s.s.s=min(VDist[a.f],dist[x].s.s.s);
                    dist[a.f].s.f=min(dist[x].s.f,min(dist[a.f].s.s.f+VDist[a.f],dist[a.f].s.s.s+UDist[a.f]));
                    pq.push({-dist[a.f].f,a.f});
                }
            }
        }
    }
    /*
    //print(dist);
    cout<<"shortest"<<endl;
    cout<<dist[T].f<<endl;
    cout<<"ans"<<endl;
    cout<<dist[T].s.f<<endl;
    cout<<"leastStops"<<endl;
    cout<<dist[T].s.s.f<<endl;
    cout<<"mostStops"<<endl;
    cout<<dist[T].s.s.s<<endl;
    */
    cout<<min(dist[T].s.f,UDist[V])<<endl;
    /*
    cout<<"test"<<endl;
    F0R(i,N){
        cout<<"i: "<<i<<endl;
        cout<<"shortest: ";
        cout<<dist[i].f<<endl;
        cout<<"ans: ";
        cout<<dist[i].s.f<<endl;
        cout<<"leastStops: ";
        cout<<dist[i].s.s.f<<endl;
        cout<<"mostStops: ";
        cout<<dist[i].s.s.s<<endl;        
    }
    //acount for case where u just skip the S to T
    

    cout<<"adjList"<<endl;
    trav(a,adjList){trav(b,a){cout<<"{"<<b.f<<" "<<b.s<<"}"<<" ";}cout<<endl;}
    cout<<"test stuff"<<endl;
    
    cout<<dist[4].s.f<<endl;
    cout<<dist[5].s.f<<endl;
    cout<<dist[6].s.f<<endl;
    cout<<dist[7].s.f<<endl;    
    
    F0R(i,N){
        cout<<i<<" "<<dist[i].s.f<<endl;
    }
    */

}

컴파일 시 표준 에러 (stderr) 메시지

commuter_pass.cpp: In function 'void setIO(std::string)':
commuter_pass.cpp:6:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    6 |     freopen((s+".in").c_str(),"r",stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:7:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    7 |     freopen((s+".out").c_str(),"w",stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...