Luogu P1396 营救【最小生成树/二分答案/最短路】 By celur925

题目描述

“咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门……

妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小明被带到了t区,而自己在s区。

该市有m条大道连接n个区,一条大道将两个区相连接,每个大道有一个拥挤度。小明的妈妈虽然很着急,但是不愿意拥挤的人潮冲乱了她优雅的步伐。所以请你帮她规划一条从s至t的路线,使得经过道路的拥挤度最大值最小。

输入输出格式

输入格式:

第一行四个数字n,m,s,t。

接下来m行,每行三个数字,分别表示两个区和拥挤度。

(有可能两个区之间有多条大道相连。)

输出格式:

输出题目要求的拥挤度。

输入输出样例

输入样例#1:

3 3 1 3
1 2 2
2 3 1
1 3 3

输出样例#1:

2

说明

数据范围

30% n<=10

60% n<=100

100% n<=10000,m<=2n,拥挤度<=10000

题目保证1<=s,t<=n且s<>t,保证可以从s区出发到t区。

样例解释:

小明的妈妈要从1号点去3号点,最优路线为1->2->3。

我们一看题:拥挤度最大 值最小,哦?二分差不多。然鹅本鸽今天并不想写二分,我觉得MIT海星。

我们跑一遍朴素的Kruskal,但是并过不了样例。

那就跑一遍SPfa,找最短路上最大边,也不行。

还是老老实实写二分吧。

法一:二分答案

边权到了10000,二分似乎可行,复杂度O(logn),check函数可以跑一遍spfa(其实只跑bfs也行),看二分出的答案是否可行。

spfa的复杂度是O(玄学常数*m),总复杂度可近似看做O(mlogn)

法二:MIT

出于好奇,并查看Chemist代码,发现了MIT的做法,只需稍加判断即可,当起点和终点 同属于一个联通块时,他们就联通了,答案筛选结束。

code Version1

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,s,t,x,y,z,num=0;
 4 const int MAXX=2147483647;
 5 int dis[10010],head[10010];
 6 bool v[10010];
 7 queue<int>q;
 8 struct node{
 9     int end,next,w;
10 }e[1000010];
11 void add(int x,int y,int z)
12 {
13     num++;
14     e[num].w=z;
15     e[num].end=y;
16     e[num].next=head[x];
17     head[x]=num;
18 }
19 void SPFA()
20 {
21     for(int i=1;i<=n;i++)
22      dis[i]=MAXX;
23     memset(v,0,sizeof(v));
24     q.push(s);
25     dis[s]=0;v[s]=1;
26     while(q.size())
27     {
28         int x=q.front();
29         q.pop();v[x]=0;
30         for(int i=head[x];i;i=e[i].next)
31         {
32             int y=e[i].end,z=e[i].w;
33             int mx=max(dis[x],z);
34             if(dis[y]>mx)
35             {
36                 dis[y]=mx;
37                 if(!v[y])q.push(y),v[y]=1;
38             }
39         }
40     }
41 }
42 int main()
43 {
44     scanf("%d%d%d%d",&n,&m,&s,&t);
45     for(int i=1;i<=m;i++){
46         scanf("%d%d%d",&x,&y,&z);
47         add(x,y,z);add(y,x,z);
48     }
49     SPFA();
50     cout<<dis[t]<<endl;
51     return 0;
52 }

原文地址:https://www.cnblogs.com/nopartyfoucaodong/p/9465145.html

时间: 2024-08-29 04:41:11

Luogu P1396 营救【最小生成树/二分答案/最短路】 By celur925的相关文章

洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA

洛谷P1462 通往奥格瑞玛的道路二分答案+最短路SPFA 二分交费最多的一次的钱数 然后只将符合要求的边加入图中 如果到终点的最短路大于等于血量 或者直接起点不能到达终点那么说明不符合要求 需要加大答案 时间复杂度 (log答案)* Ek 需要注意如果本来就不能到达 那么直接输出AFK 1 #include <bits/stdc++.h> 2 #define LL long long 3 #define For(i,j,k) for(int i=j;i<=k;i++) 4 using

洛谷P1462通往奥格瑞玛的道路——二分答案最短路

题目:https://www.luogu.org/problemnew/show/P1462 最大值最小问题,二分答案. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; int const MAXN=1e5+5; queue<int>q; int n,m,b,cost[MAXN],head[MAXN],

【洛谷】【二分答案+最短路】P1462 通往奥格瑞玛的道路

在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目背景 [题目描述:] 在艾泽拉斯,有n个城市.编号为1,2,3,...,n. 城市之间有m条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量. 每次经过一个城市,都会被收取一定的过路费(包括起点和终点).路上并没有收费站. 假设1为暴风城,n为奥格瑞玛,而他的血量最多为b,出发时他的血量

Luogu P1084 疫情控制 | 二分答案 贪心

题目链接 观察题目,答案明显具有单调性. 因为如果用$x$小时能够控制疫情,那么用$(x+1)$小时也一定能控制疫情. 由此想到二分答案,将问题转换为判断用$x$小时是否能控制疫情. 对于那些在$x$小时内不能够走到根节点的子节点上的军队,让他们尽量往上走即可,走到哪里是哪里,这样显然不会更劣. 对于那些在$x$小时内能走到根节点的子节点上的军队,就让他们先走到根节点的子节点上. 然后搞搞贪心即可. #include<iostream> #include<cstdio> #incl

[Usaco2007 Jan]Telephone Lines架设电话线[二分答案+最短路思想]

Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N <= 1,000)根按1..N顺次编号的废弃的电话线杆,任意两根电话线杆间都没有电话线相连.一共P(1 <= P <= 10,000)对电话线杆间可以拉电话线,其余的那些由于隔得太远而无法被连接. 第i对电话线杆的两个端点分别为A_i.B_i,它们间的距离为 L_i (1 <= L_i

luogu P1396 营救

题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门…… 妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小明被带到了t区,而自己在s区. 该市有m条大道连接n个区,一条大道将两个区相连接,每个大道有一个拥挤度.小明的妈妈虽然很着急,但是不愿意拥挤的人潮冲乱了她优雅的步伐.所以请你帮她规划一条从s至t的路线,使得经过道路的拥挤度最大值最小. 输入输出格式 输入格式: 第一行四个数字n,m,s,t. 接下来

luogu P2678 跳石头 二分答案

1 #include <cstdio> 2 using namespace std; 3 int a[51000]; 4 int len,m,n; 5 bool check(int x) 6 { 7 int last = 0; 8 int ans = 0; 9 for (int i = 1;i <= n;i++) 10 { 11 if (a[i] - last < x) 12 ans++; 13 else 14 last = a[i]; 15 } 16 if (ans > m

[Luogu P1462] 通往奥格瑞玛的道路 (二分答案+最短路径)

题面 传送门:https://www.luogu.org/problemnew/show/P1462 Solution 这道题如果去除掉经过城市的收费.那么就是裸的最短路 但是题目要求经过城市中最多的一次性收费的最小值,也就是说让经过的最大值尽可能小 那我们可以考虑二分这个最大值 一切收费大于我们二分的值的城市统统不走 在最短路那里改一下就好了 然后就OjbK了 时间复杂度 O(n*logn*log b) Code //Luogu P1462 通往奥格瑞玛的道路 //May,27th,2018

[luogu]P1800 software_NOI导刊2010提高(06)[DP][二分答案]

[luogu]P1800 software_NOI导刊2010提高(06) 题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成m个模块,由公司里的技术人员分工完成,每个技术人员完成同一软件的不同模块的所用的天数是相同的,并且是已知的,但完成不同软件的一个模块的时间是不同的,每个技术人员在同一时刻只能做一个模块,一个模块只能由一个人独立完成而不能由多人协同完成.一个技术人员在整个开发期内完成一个模块以后可以接着做任一软件的任一模块.写