• 【CodeForces


    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

    Input
    5 4 2
    1 2 5
    1 2 3
    2 3 4
    1 4 10
    1 5
    Output
    3
    Input
    3 1 1
    1 2 3
    3
    Note

      样例一示意图,暗色的是仓库,白色的是普通城市

      题目链接

      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;
      }
    • 相关阅读:
      关于求 p_i != i and p_i != i+1 的方案数的思考过程
      poj 3041 Asteroids 二分图最小覆盖点
      poj 1325 Machine Schedule 最小顶点覆盖
      poj 1011 Sticks 减枝搜索
      poj 1469 COURSES 最大匹配
      zoj 1516 Uncle Tom's Inherited Land 最大独立边集合(最大匹配)
      Path Cover (路径覆盖)
      hdu 3530 SubSequence TwoPoint单调队列维护最值
      zoj 1654 Place the Rebots 最大独立集转换成二分图最大独立边(最大匹配)
      poj 1466 Girls and Boys 二分图最大独立子集
    • 原文地址:https://www.cnblogs.com/sky-stars/p/11225766.html
    Copyright © 2020-2023  润新知