제출 #853950

#제출 시각아이디문제언어결과실행 시간메모리
853950parsadox2Commuter Pass (JOI18_commuter_pass)C++17
0 / 100
84 ms22260 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e5 + 10;
int n , m , s , t , ss , tt , dis[2][N];
vector <pair<int , int>> adj[N];
bool marked[N];

void dij(int star , int h[])
{
	memset(h , 63 , N);  memset(marked , false , sizeof marked);
	h[star] = 0;
	priority_queue <pair<int , int>> pq;
	pq.push({0 , star});
	while(!pq.empty())
	{
		auto now = pq.top();  pq.pop();
		int v = now.second , D = abs(now.first);
		if(marked[v])
			continue;
		marked[v] = true;
		for(auto u : adj[v])  if(h[u.first] > D + u.second)
		{
			h[u.first] = D + u.second;
			pq.push({-h[u.first] , u.first});
		}
	}
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);  cout.tie(0);
	cin >> n >> m >> s >> t >> ss >> tt;
	vector <pair<pair<int , int> , int>> edges;
	while(m--)
	{
		int a , b , w;
		cin >> a >> b >> w;
		adj[a].push_back({b , w});
		adj[b].push_back({a , w});
		edges.push_back({{a , b} , w});
	}
	dij(s , dis[0]);
	dij(t , dis[1]);
	for(auto e : edges)
	{
		int a = e.first.first , b = e.first.second , w = e.second;
		if(dis[0][a] + dis[1][b] + w == dis[0][t])
			adj[a].push_back({b , 0});
		if(dis[0][b] + dis[1][a] + w == dis[0][t])
			adj[b].push_back({a , 0});
	}
	dij(ss , dis[0]);
	dij(tt , dis[1]);
	cout << min(dis[0][tt] , dis[1][ss]) << endl;
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...