Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<vector>
- #include<queue>
- using namespace std;
- typedef long long int ll;
- struct edge{
- int v;
- ll w;
- };
- struct elem{
- ll dis;
- int u;
- bool operator < (const elem& rhs)const
- {
- return dis > rhs.dis;
- }
- };
- int main()
- {
- int n,m;
- scanf("%d %d",&n,&m);
- int sour,dest;
- ll budget;
- scanf("%d %d %lld",&sour,&dest,&budget);
- vector<edge> adj[n];
- for(int i = 0 ; i < m ; i ++){
- int u,v;
- ll w;
- scanf("%d %d %lld",&u,&v,&w);
- adj[u].push_back({v,w});
- adj[v].push_back({u,w});
- }
- ll distFs[n];
- bool visitedFs[n];
- ll distFd[n];
- bool visitedFd[n];
- for(int i = 0 ; i < n ; i ++){
- distFs[i] = 1e18;
- distFd[i] = 1e18;
- visitedFs[i] = false;
- visitedFd[i] = false;
- }
- priority_queue<elem> pq;
- distFs[sour] = 0;
- pq.push({distFs[sour],sour});
- while(!pq.empty()){
- int u = pq.top().u;
- pq.pop();
- if(visitedFs[u])continue;
- visitedFs[u] = true;
- for(int i = 0 ; i < adj[u].size() ; i ++){
- int v = adj[u][i].v;
- ll w = adj[u][i].w;
- if(distFs[u] + w < distFs[v] && !visitedFs[v]){
- distFs[v] = distFs[u] + w;
- pq.push({distFs[v],v});
- }
- }
- }
- if(distFs[dest] <= budget){
- printf("%d %lld 0",dest,distFs[dest]);
- return 0;
- }
- distFd[dest] = 0;
- pq.push({distFs[dest],dest});
- while(!pq.empty())
- {
- int u = pq.top().u;
- pq.pop();
- if(visitedFd[u])continue;
- visitedFd[u] = true;
- for(int i = 0 ; i < adj[u].size() ; i ++){
- int v = adj[u][i].v;
- ll w = adj[u][i].w;
- if(distFd[u] + w < distFd[v] && !visitedFd[v]){
- distFd[v] = distFd[u] + w;
- pq.push({distFd[v],v});
- }
- }
- }
- int mina = 1e18;
- int minb = 0;
- int mini = 0;
- for(int i = 0 ; i < n ; i ++){
- if(distFs[i] <= budget && distFd[i] < mina){
- mina = distFd[i];
- minb = distFs[i];
- mini = i;
- }
- }
- printf("%d %lld %lld",mini,minb,mina);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement