Submission #540224

#TimeUsernameProblemLanguageResultExecution timeMemory
540224krit3379Commuter Pass (JOI18_commuter_pass)C++17
0 / 100
275 ms24604 KiB
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
#define N 100005

struct A{
    long long a,w,p;
    bool operator<(const A& o)const{
        return w>o.w;
    }
};

priority_queue<A> q;
vector<A> g[N];

vector<pair<ll, ll>> graph[100001];
vector<vector<long long>> dis(2,vector<long long>(N,1e18));
ll ds[100001], dp[2][100001], ans;
bool visited[100001];

void dijk(int idx,int s){
    q.push({s,0});
    dis[idx][s]=0;
    while(!q.empty()){
        auto [a,w,p]=q.top();
        q.pop();
        if(w>dis[idx][a])continue;
        for(auto x:g[a]){
            if(w+x.w<dis[idx][x.a])q.push({x.a,w+x.w}),dis[idx][x.a]=w+x.w;
        }
    }
}

void dijkstra2(ll start, ll end) {
	fill(dp[0], dp[0] + 100001, LLONG_MAX / 2);
	fill(dp[1], dp[1] + 100001, LLONG_MAX / 2);
	fill(visited, visited + 100001, false);

	priority_queue<pair<ll, pair<ll, ll>>> pq;
	pq.push({0, {start, 0}});
	dp[0][0] = dp[1][0] = LLONG_MAX/ 2;
	while (!pq.empty()) {
		ll c, node, par;
		pair<ll, ll> p;
		tie(c, p) = pq.top();
		tie(node, par) = p;
		pq.pop();

		if (!visited[node]) {
			visited[node] = true;
			ds[node] = -c;
			dp[0][node] = min(dis[0][node], dp[0][par]);
			dp[1][node] = min(dis[1][node], dp[1][par]);
			for (auto i : graph[node]) pq.push({c - i.second, {i.first, node}});
		} else if (-c == ds[node]) {
			if (min(dis[0][node], dp[0][par]) + min(dis[1][node], dp[1][par]) <= dp[0][node] + dp[1][node]) {
				dp[0][node] = min(dis[0][node], dp[0][par]);
				dp[1][node] = min(dis[1][node], dp[1][par]);
			}
		}
	}

	ans = min(ans, dp[0][end] + dp[1][end]);
}

int main() {
    int n,m,s,t,u,v,i,a,b;
    long long w;
    scanf("%d %d %d %d %d %d",&n,&m,&s,&t,&u,&v);
    for(i=1;i<=m;i++){
        scanf("%d %d %lld",&a,&b,&w);
        g[a].push_back({b,w});
        g[b].push_back({a,w});
    }

	dijk(0,u);
	dijk(1,v);

	ans = dis[0][v];

	dijkstra2(s, t);
	dijkstra2(t, s);

	printf("%lld",ans);
	return 0;
}

Compilation message (stderr)

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:69:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |     scanf("%d %d %d %d %d %d",&n,&m,&s,&t,&u,&v);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:71:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   71 |         scanf("%d %d %lld",&a,&b,&w);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...