0
点赞
收藏
分享

微信扫一扫

小A的出差

全栈顾问 2022-04-22 阅读 144
c++
#include<bits/stdc++.h>
using namespace std;
#define PII pair<int,int>
#define fi first
#define se second
const int N=1e6+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
int n,m,k,start,ed;
long long x;
vector<PII> ve[N];
long long go[N],to[N],st[N],dist1[N],dist2[N];
//dist1存从起点到其他点的距离,dist2存从终点到其他点的距离

void dijkstra_1()
{
	priority_queue<PII,vector<PII>,greater<PII>>q;
    q.push({0,start});
    dist1[start]=0;
    while(q.size())
    {
        auto t=q.top();q.pop();
        int ver=t.se,dis=t.fi;
        if(st[ver]) continue;
        st[ver]=true;
        for(int i=0;i<(int)ve[ver].size();i++)
        {
            int j=ve[ver][i].fi;
            int d=ve[ver][i].se;
            if(dist1[j]>dis+d)
            {
                dist1[j]=dis+d;
                q.push({dist1[j],j});
            }
        }
    }
}

void dijkstra_2()
{
	priority_queue<PII,vector<PII>,greater<PII>>q;
	q.push({0,ed});
	dist2[ed]=0;
	while(q.size())
	{
		auto t=q.top();q.pop();
		int ver=t.se,dis=t.fi;
		if(st[ver]) continue;
		st[ver]=true;
		for(int i=0;i<(int)ve[ver].size();i++)
		{
			int j=ve[ver][i].fi;
			int d=ve[ver][i].se;
			if(dist2[j]>dis+d)
			{
				dist2[j]=dis+d;
				q.push({dist2[j],j});
			}
		}
	}
}

int main() 
{
	scanf("%d %d %d %d %d %lld",&n,&m,&k,&start,&ed,&x);
	memset(dist1,0x3f,sizeof(dist1));
	memset(dist2,0x3f,sizeof(dist2));
	
	for(int i=1;i<=m;i++)
	{
		int a,b,c;
		scanf("%d %d %d",&a,&b,&c);
		ve[a].push_back({b,c});//链式向前星存边
		ve[b].push_back({a,c});
	}
	for(int i=1;i<=k;i++)
	{
		scanf("%lld %lld",&go[i],&to[i]);
	}
	
	dijkstra_1(); memset(st,0,sizeof(st)); //记得清空st
	dijkstra_2();
	
	long long res=dist1[ed];//先让结果初始等于起点到终点的距离
	int s1=-1,s2=-1,f=0;//s1,s2是免费边的两端点,f用于检测是否使用免费边
	
	for(int i=1;i<=k;i++)
	{
		long long value1=dist1[go[i]]+dist2[to[i]];
		long long value2=dist1[to[i]]+dist2[go[i]];
		if(value1<res)
		{
			f=1;
			s1=go[i];
			s2=to[i];
			res=value1;
		}
		if(value2<res)
		{
			f=1;
			s1=go[i];
			s2=to[i];
			res=value2;
		}
	}
	long long get=x-res;
	if(get<0)
	{
		printf("No\n");
		printf("-1 -1\n");
		printf("No\n");
		printf("-1\n");
	}
	else
	{
		if(f)
		{
			printf("Yes\n");
			printf("%d %d\n",s1,s2);
		}
		else
		{
			printf("No\n");
			printf("-1 -1\n");
		}
		printf("Yes\n");
		printf("%lld\n",get);
	}
	return 0 - 0;
}
举报

相关推荐

老婆出差的日子

印度出差

出差小记

出差教训

出差这件小事

出差第一天

0 条评论