Bakery
Descriptions
玛莎想在从1到n的n个城市中开一家自己的面包店,在其中一个城市烘焙松饼。
为了在她的面包房烘焙松饼,玛莎需要从一些储存的地方建立面粉供应。只有k个仓库,位于不同的城市编号为a1, a2,…,ak。
不幸的是,玛莎居住的那个国家的法律禁止在任何一个有仓库的城市开设面包店。她只能在另一个n - k城市中的一个开这家店,当然,面粉配送也要付费——从仓库到面包房每走一公里,玛莎就得支付1卢布。
形式上,玛莎将支付x卢布,如果她将打开面包店在一些城市b (ai≠b每1≤≤k),选择一个存储在一些城市s (s = aj一些1≤j≤k)和b和s是连接道路的道路摘要长度的x(如果有多个路径,玛莎是能够选择应该使用)。
玛莎非常节俭和理性。她对一个城市感兴趣,在那里她可以开自己的面包店(在k个仓库中选择一个,在有面包店的城市和有仓库的城市之间选择一条道路),并为面粉配送支付尽可能少的卢布。请帮玛莎找到这笔钱。
Input
输入的第一行包含三个整数n, m和k(1≤n, m≤105,0≤k≤n)——玛莎居住的乡村城市数量,它们之间的道路数量,以及面粉库数量。
然后是m行。每一个包含u, v和l三个整数(1≤u, v≤n, 1≤l≤109,u≠v),表示u和v之间有一条长度为l公里的道路。
如果k >为0,那么输入的最后一行包含k个不同的整数a1 a2…, ak(1≤ai≤n)——有面粉仓库的城市数量。如果k = 0,则在输入中不显示这一行。
Output
印尽可能少的卢布,玛莎应该支付面粉运送在唯一的行。
如果面包店不能在n个城市中的任何一个开设(同时满足条件),请在唯一一行打印- 1。
Examples
Input5 4 2
1 2 5
1 2 3
2 3 4
1 4 10
1 5
Output3
Input3 1 1
1 2 3
3
样例一示意图,暗色的是仓库,白色的是普通城市
题目链接
https://vjudge.net/problem/CodeForces-707B
思维题
城市1和城市5有仓库,那我们只需要考虑城市2和城市4,之所以不考虑城市3是因为仓库1到城市3必须要经过城市2,显然城市2比城市3离仓库1更近
于是,我们只要把有仓库的城市标记,如果某条双向路一端连着有仓库的城市,另一端连着没有仓库的城市,那就把这条路的长度取来作比较,留下距离最短的路即可
AC代码
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #include <sstream> #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #define Mod 1000000007 #define eps 1e-6 #define ll long long #define INF 0x3f3f3f3f #define MEM(x,y) memset(x,y,sizeof(x)) #define Maxn 100000+5 using namespace std; int n,m,k; int u[Maxn];//起点城市 int v[Maxn];//终点城市 int l[Maxn];//城市之间的距离 int vis[Maxn];//vis[x]=1 x这个城市为仓库 int main() { MEM(vis,0);//一开始都是城市 cin>>n>>m>>k; for(int i=1; i<=m; i++) cin>>u[i]>>v[i]>>l[i]; for(int i=1; i<=k; i++)//标记仓库 { int x; cin>>x; vis[x]=1; } int ans=INF; for(int i=1; i<=m; i++) { if(!vis[u[i]]&&vis[v[i]]||!vis[v[i]]&&vis[u[i]])//一个城市为仓库,一个城市不是仓库,取中间距离 ans=min(ans,l[i]); } if(ans!=INF) cout<<ans<<endl; else cout<<-1<<endl; return 0; }