LA 6891 Money Transfers(最短路)

https://vjudge.net/problem/UVALive-6891

题意:

给定一个加权无向图,还有起点和终点,现在有个SWERC公司,拥有图中的m个顶点,现在可以使图中的每一条边都加上k后求最短路,使得最短路上的点都包括在SWERC公司拥有的m个顶点中。求k的最大值。

思路:

对于k,采用二分法枚举。
我们可以求出起点到终点的最短路径,然后判断这些点是否都在SWERC公司当中即可。

还有容易错的一点!!

每个图中可能不止一条最短路,也许一条最短路时满足条件的,但是另外的是不满足的,那么这样也是不行的。

对于这个可以这样解决,在dijkstra算法当中,每次选择最短边加入时,在长度相同的情况下,我们优先选择不在SWERC公司中的顶点,这样这个问题就解决了。

  1 #include<iostream>
  2 #include<algorithm>
  3 #include<cstring>
  4 #include<cstdio>
  5 #include<sstream>
  6 #include<vector>
  7 #include<stack>
  8 #include<queue>
  9 #include<cmath>
 10 #include<map>
 11 using namespace std;
 12 typedef long long ll;
 13 typedef pair<int,long long> pll;
 14 const int INF=0x3f3f3f3f;
 15 const int maxn=1000+5;
 16
 17 int n,p,src,dst,m;
 18
 19 int sw[maxn];
 20 ll d[maxn];
 21 int vis[maxn];
 22 int path[maxn];
 23
 24 vector<pll> G[maxn];
 25
 26 bool dijkstra(ll x)
 27 {
 28     memset(d,INF,sizeof(d));
 29     memset(vis,0,sizeof(vis));
 30     memset(path,0,sizeof(path));
 31
 32     d[src]=0;
 33
 34     for(int i=1;i<=n;i++)
 35     {
 36         ll MIN =20000000000000LL;
 37         int pos;
 38         for(int j=1;j<=n;j++)
 39         {
 40             if(d[j]<=MIN && !vis[j])
 41             {
 42                 if(d[j]==MIN) {if(sw[j]==0) pos=j;}  //这个很重要,优先考虑不在SW中的点
 43                 else
 44                 {
 45                      MIN=d[j];
 46                      pos=j;
 47                 }
 48             }
 49         }
 50
 51         if(MIN==20000000000000LL)  break;
 52         if(pos==dst)  break;
 53         vis[pos]=1;
 54
 55         for(int j=0;j<G[pos].size();j++)
 56         {
 57             int v=G[pos][j].first;
 58             if(vis[v])  continue;
 59             ll w=G[pos][j].second+x;
 60             if(d[pos]+w<d[v])
 61             {
 62                 d[v]=d[pos]+w;
 63                 path[v]=pos;
 64             }
 65         }
 66     }
 67
 68     for(int i=dst;path[i]!=0;i=path[i])
 69         if(sw[i]==0)  return false;
 70
 71     return true;
 72 }
 73
 74
 75 int main()
 76 {
 77     //freopen("input.txt","r",stdin);
 78     while(~scanf("%d%d%d%d",&n,&p,&src,&dst))
 79     {
 80         for(int i=1;i<=n;i++)  G[i].clear();
 81         memset(sw,0,sizeof(sw));
 82
 83         for(int i=0;i<p;i++)
 84         {
 85             int a,b; ll c;
 86             scanf("%d%d%lld",&a,&b,&c);
 87             G[a].push_back(make_pair(b,c));
 88             G[b].push_back(make_pair(a,c));
 89         }
 90
 91         scanf("%d",&m);
 92         for(int i=0;i<m;i++)
 93         {
 94             int x;
 95             scanf("%d",&x);
 96             sw[x]=1;
 97         }
 98
 99         ll ans=0;
100         ll L=0,R=20000000000000LL;
101         while(L<=R)
102         {
103             ll mid=(L+R)/2;
104             if(dijkstra(mid))
105             {
106                 ans=mid;
107                 L=mid+1;
108             }
109             else R=mid-1;
110         }
111
112
113         if(ans==0)  puts("Impossible");
114         else if(ans==20000000000000LL)  puts("Infinity");
115         else printf("%lld\n",ans);
116     }
117     return 0;
118 }
时间: 2024-08-06 03:40:37

LA 6891 Money Transfers(最短路)的相关文章

LA 4223 最短路 路径选择要求提高一点

F - Trucking Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description A certain local trucking company would like to transport some goods on a cargo truck from one place to another. It is desirable to transport

timus 1210 Kind Spirits(最短路)(动态规划)

Kind Spirits Time limit: 1.0 secondMemory limit: 64 MB Ivanushka the Fool lives at the planet of 0-level. It's very unpleasant to live there. An awful climate, 80 hours working week, ugly girls… He, as well as every inhabitant of his planet, dreams t

[bzoj1001][BeiJing2006]狼抓兔子-题解[平面图最小割转最短路]/[Dinic求最小割]

Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<==>(x+1,y) 2:(x,y)<==>(x,y+1) 3:(x,y)<==>(x+1,y+1) 道路上的权值表示这条路上最多能够通过的兔子数,道路

HDU 3268 Columbus’s bargain(最短路 Spfa)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3268 Problem Description On the evening of 3 August 1492, Christopher Columbus departed from Palos de la Frontera with a few ships, starting a serious of voyages of finding a new route to India. As you k

CSU 1307 最短路+二分

题目大意: 帮忙找到一条a到b的最短路,前提是要保证路上经过的站点的最大距离尽可能短 这道题居然要用到二分...完全没去想过,现在想想求最大距离的最小值确实是... 这里不断二分出值代入spfa()或者dijkstla()中计算a到b的最短距离,每次都保证只经过边小于mid值的路径 1 #include <iostream> 2 #include <cstdio> 3 #include <queue> 4 #include <cstring> 5 #incl

空中楼阁 ( House )最短路

题目描述: 话说Z4阴差阳错地来到了神秘岛.不久,他们发现,这是一个由n个小岛和一个中心岛组成的群岛,群岛之间有m座桥.令他们感到惊讶的是,这些桥并不是固定不变的,经较长时间的观察,发现它们会随时间作周期性的变化(即桥的两端会不断更换). 立方很早就留意到远远的那个中心岛了.他发现岛的上空好像有一个很巨大的东西,但实在太远了,看不清楚.此时jakrinchose得意地从身上拿出一个超高倍数望远镜,好像很自豪的样子,因为他平时专门用来看美女的工具此时终于派得上用场了."那是一间小屋!架在一棵好大好

P4467 [SCOI2007]k短路

题目描述 有 n 个城市和 m 条单向道路,城市编号为 1 到 n .每条道路连接两个不同的城市,且任意两条道路要么起点不同要么终点不同,因此 n 和 m 满足 m \le n(n-1)m≤n(n−1) . 给定两个城市a和b,可以给a到b的所有简单路(所有城市最多经过一次,包括起点和终点)排序:先按长度从小到大排序,长度相同时按照字典序从小到大排序.你的任务是求出a到b的第 k 短路 输入输出格式 输入格式: 输入第一行包含五个正整数n, m, k, a, b. 以下m行每行三个整数u, v,

hdu3461Marriage Match IV 最短路+最大流

//给一个图.给定起点和终点,仅仅能走图上的最短路 //问最多有多少种走的方法.每条路仅仅能走一次 //仅仅要将在最短路上的全部边的权值改为1.求一个最大流即可 #include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<vector> using namespace std ; const int inf = 0x3f3f3f3f ; const

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000