列表

详情


NC25235. 免费机票

描述

        某华大学小飞中奖了!!!奖品是一张免费飞机票,唯一遗憾的是,这张飞机票有限定区间,需要从k个区间中选择其一。小飞打算高高兴兴的出去玩啦,但是,从s地出发,去往e地,可能没有直达的飞机票,可能需要转机(所有飞机线路都是无向的),小飞毕竟是个学生党,出去玩首先得考虑省钱,所以,小飞遇到麻烦了,请帮小飞计算最便宜的一条路线,小飞会很感激你的。

输入描述

第一行为三个整数n,s,e,n表示n个不同城市的飞机场,s为出发点,e为目的地。(1<=n<=1000,  1<=s,e<=n)

第二行为一个整数m,表示m条普通飞机线路,接下来的m行描述每条线路,每行包含三个整数a、b、c,a、b代表普通飞机线路两端,c表示价格。(1<=m<=1000, 1<=a,b<=n, 1<=c<=1000)

接下来的一行为一个整数k,表示k个免费机票的航线区间, 然后k行来描述每条免费航线,每行两个整数a’、b’, 分别代表免费航线两端。(1<=k<=1000, 1<=a’,b’<=n)

输出描述

每个测试数据有两行输出,第一行为是否使用免费飞机票,是则输出“Yes”,否则输出“No”。第二行输出总共花费。

示例1

输入:

4 1 4
3
1 2 1
1 3 2
2 4 3
1
3 4

输出:

Yes
2

示例2

输入:

7 1 7
5
1 4 1
1 5 2
1 7 10
4 7 8
5 7 5
2
2 4
6 7

输出:

No
7

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 902ms, 内存消耗: 4444K, 提交时间: 2019-04-21 22:15:02

#include<bits/stdc++.h>
using namespace std;
int n,s,e,m,a,b,k,c,i,j,mymap[1001][1001],ans,u,v;
int main()
{
	int t,flag = 0;
	cin>>n>>s>>e;
	cin>>m;
	memset(mymap,0x3f,sizeof(mymap));
	for(i = 0;i<=n;i++)
	{
		mymap[i][i] = 0;
	}
	for(i = 0;i<m;i++)
	{
		cin>>a>>b>>c;
		mymap[a][b] = c;
		mymap[b][a] = c;
	}	
	for(k = 1;k<=n;k++)
		for(i = 1;i<=n;i++)
			for(j = 1;j<=n;j++)
				if(mymap[i][j]>mymap[i][k]+mymap[k][j])
					mymap[i][j]=mymap[i][k]+mymap[k][j];				
	ans = mymap[s][e];
	cin>>k;
	while(k--)
	{
        cin>>u>>v;
        if(ans>mymap[s][u]+mymap[v][e]||ans>mymap[s][v]+mymap[u][e])
        {
        	flag = 1;
        	ans = min(mymap[s][u]+mymap[v][e],mymap[s][v]+mymap[u][e]);
		}
    }
	if(flag)
	{
		cout<<"Yes"<<endl;
		cout<<ans;
	}
	else
	{
		cout<<"No"<<endl;
		cout<<ans;
	}
	return 0;
}

上一题