题和题解:最"大"路

题目:

【Description】

int getzuiduanlu(int x)

这是一行多么精妙的代码。

简明扼要的说明了这个函数要解决的问题。

现在我们就要解决一个最短路问题。

给定一张N点M边的无向图,求从点1到其余所有点的最短路。

这里的最短路指的是,从点1到某个点,边权最大的边最小的一条路径。

【Input】

跟我平时输入图的方法一样。要是看不懂就看样例吧。

【Output】

N-1行每行一个整数,第i行表示从点1到第i+1个点最短路中,边权最大的边的权值。

到不了输出-1。

【Sample Input】

3 3

1 2 1

2 3 1

1 3 2

【Sample Output】

1

1

【Hint】

20%:N, M <= 10

40%:N, M <= 1000

60%:N, M <= 100000

100%:N, M <=1000000

C++选手请注意对IO的优化。

时限2s;

这个题有人YY说要先跑个最小生成树,然后再跑搜索。我不信,先写个生成树然后再操作我觉得还算靠谱,但是考试时候还是在努力地被题目忽悠的往最短路上面想~~

事实上,最短路的思想也是正确的,对于标准的正解,大家还存在争议,不过,只要能做出来就行吧~~

好,现在先说我的最短路解法:

对 于spfa或者dijkstra,最短路中使用dis数组记录到达每个点的最短路总长,在这个题里面我们就可以想到用同样的算法来解决路径上最大边权值的 问题。我们只需要做一点点修改就可以巧妙的解决这个问题了~~当然这需要对最短路算法的深刻的理解才可以(偷笑~~我还真是不谦虚啊~~彪悍的人生不需要 低调,哈哈~~鄙视啊)~~

我所理解的我们的最短路算法的思想就是我们在没有整个图的时候,对于当前情况下维护一个当前的最优解,当我们遍历到更多的边和点的时候,如果能够优化我们以前求得的答案,我们就更改他。

所以,不难和这个题联想到一起。

只需要把我们的dis数组所保存的东西改一下就好了~~~

好了,现在我们来考虑一下怎么推出dis数组:

对 于当前的一个点x,我们便利它连的每一条边,下面用edge表示,终点记为t。然后我们现在(某个时刻)已经最短路一样的操作了一定的边,知道了x的 dis,也就是说我们从当前来说最优的一条路上走到x时候整条路上最大的一条边的权值记为dis[x],然后我们只需要再从edge走过去就到达了t,那 么从当前路径到达t的最大边权值就是max(w,dis[x]),这一点是显而易见的。那么我们只需要比较这个max和dis[t]的值,将dis[t] 保存为较小的那一个就好了,这里只是对三角不等式进行修改就好,之后当我们整张图都更新完之后得到的就是最终答案,很显然吧。

好了,上代码:用了spfa,数据有一个点TLE了,用堆优dijkstra就能解决这个问题了。。。。。两秒时限还算良心。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<cstring>
 5 #define INF 70232024
 6 #define MAXN 1000010
 7 using namespace std;
 8 struct edge
 9 {
10        int s,t,next;
11        int w;
12 }ed[2*MAXN];
13 int tot=0,head[MAXN];
14 int n,m;
15 inline void add(int s,int t,int w)
16 {
17      ed[tot].s=s; ed[tot].t=t; ed[tot].w=w; ed[tot].next=head[s]; head[s]=tot++;
18 }
19 int dis[MAXN];
20 bool vis[MAXN];
21 inline void spfa()
22 {
23       queue <int> q;
24       q.push(1);
25       dis[1]=0;
26       vis[1]=true;
27       while(!q.empty())
28       {
29             int x=q.front();
30             q.pop();
31             vis[x]=false;
32             for(int i=head[x];i!=-1;i=ed[i].next)
33             {
34                     int t=ed[i].t,w=ed[i].w;
35                     int mx=dis[x]>w?dis[x]:w;
36                     if(dis[t]>mx)
37                     {
38                            dis[t]=mx;
39                            if(!vis[t])
40                            {
41                                  q.push(t);
42                                  vis[t]=true;
43                            }
44                     }
45             }
46       }
47 }
48 int main()
49 {
50     memset(head,-1,sizeof(head));
51     cin>>n>>m;
52     for(int i=1;i<=n;i++)dis[i]=INF;
53     for(int i=1;i<=m;i++)
54     {
55             int a,b,c;
56             scanf("%d%d%d",&a,&b,&c);
57             add(a,b,c);
58             add(b,a,c);
59     }
60     spfa();
61     for(int i=2;i<=n;i++)
62     {
63         if(dis[i]==INF)printf("-1\n");
64             else printf("%d\n",dis[i]);
65     }
66     return 0;
67 }

时间: 2024-10-13 12:42:34

题和题解:最"大"路的相关文章

网易2017春招笔试真题编程题集合题解

01 双核处理 题目 一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务.n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间. 输入描述 输入包括两行:第一行为整数n(1 ≤ n ≤ 50)第二行为n个整数lengthi,表示每个任务的长度为length[i]kb,每个数均为1024的倍数. 输出描述输出一个整数,表示最少需

一些贪心题的题解

众所周知,贪心是一个比较恶心的算法. 区别于常规的算法或数据结构,贪心题一般不会让人看到就想到思路,而是需要我们在一些猜测或是感性分析下,找到一种局部最优的方案,并且可以通过局部最优解推出全局最优解. T1:防晒 有C头奶牛进行日光浴,第i头奶牛需要minSPF[i]到maxSPF[i]单位强度之间的阳光. 每头奶牛在日光浴前必须涂防晒霜,防晒霜有L种,涂上第i种之后,身体接收到的阳光强度就会稳定为SPF[i],第i种防晒霜有cover[i]瓶. 求最多可以满足多少头奶牛进行日光浴. 输入格式

Codeforces Round #631 (Div. 2) C. Dreamoon Likes Coloring(贪心好题/意识流题解)

Dreamoon likes coloring cells very much. There is a row of nn cells. Initially, all cells are empty (don't contain any color). Cells are numbered from 11 to nn . You are given an integer mm and mm integers l1,l2,…,lml1,l2,…,lm (1≤li≤n1≤li≤n ) Dreamoo

名校联赛DAY.2A层第一题passward题解

问题 A: Passward 时间限制: 1 Sec  内存限制: 512 MB 题目描述 你来到了一个庙前,庙牌上有一个仅包含小写字母的字符串 s. 传说打开庙门的密码是这个字符串的一个子串 t,并且 t 既是 s 的前缀又是 s的后缀并且还在 s 的中间位置出现过一次. 如果存在这样的串,请你输出这个串,如有多个满足条件的串,输出最长的那一个. 如果不存在这样的串,输出"Just a legend"(去掉引号). 输入格式: 仅一行,字符串 s. 输出格式: 如题所述 样例输入 f

【网络流24题】----题解(部分,持续更新...)

搭配飞行员 搭配飞行员:http://cogs.yeefan.us/cogs/problem/problem.php?pid=14 题解:建立虚拟源点汇点,然后水过 code:http://cogs.yeefan.us/cogs/submit/code.php?id=148410 数字梯形 数字梯形:http://cogs.yeefan.us/cogs/problem/problem.php?pid=738 题解: 规则(1) 把梯形中每个位置抽象为两个点(i.a),(i.b),建立附加源S汇T

自己出的水题的题解

小小地整理一下我近几天(周)出的题--也不算特别难吧 戳我,我是题目链接 小小的写一下\(\rm{Solution}\) \(T1:\) 显然是个递推,我们思考第一个情况,对于新加进来的一个物体,他要么自成一圈,要么加入到剩下的空里面.而\(n-1\)个物品的圆排列总共有\(n-1\)个空隙.所以: 我们用\(f_{i,j}\)表示\(i\)个物体,组成\(j\)个圆排列的方案数.那么这个东西的转移就是 \(f_{i,j} = f_{i-1,j - 1} + (i - 1) \times f_{

每日温度(LeetCode Medium难度算法题)题解

LeetCode 题号739中等难度 每日温度 题目描述: 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高,请在该位置用 0 来代替. 例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]. 提示:气温 列表长度的范围是 [1, 30000].每个气温的值的均为华氏度,都是在 [30, 100] 

精灵鼠从入口到出口最少减少速度(2019年哔哩哔哩校招真题)题解

题目以及输入输出描述: 题目很短.意思也很容易读懂. 题目要求就是  有一只老鼠,进入了一个迷宫,迷宫地图的大小为n*n.老鼠要从(起点)(0,0)坐标位置 到达 终点 (n-1,n-1)的位置. 老鼠的行动方式只有两种 —— 向下和向前. 每一个点都会让老鼠的速度降低(减少).求老鼠到达终点的时候最少减少的速度. 解题思路: 我们先考虑最后一步 到达终点,这一步可以从哪里来呢?根据题目分析因为老鼠只可以向下或者向前.所以到达终点(n-1,n-1)前,老鼠不是在(n-1,n-2), 就是在(n-

9.5 考试 第二题 通讯题解

问题 B: 通讯 时间限制: 1 Sec  内存限制: 256 MB 题目描述 "这一切都是命运石之门的选择." 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮). 为了掌握时间机器的技术,SERN总部必须尽快将这个消息通过地下秘密通讯 网络,传达到所有分部. SERN共有N个部门(总部编号为0),通讯网络有M条单向通讯线路,每条线 路有一个固定的通讯花费Ci. 为了保密,消息的传递只能按照固定的方式进行:从一个已知消