HDU多校3 - 6797 Tokitsukaze and Rescue(dfs+最短路)
题目链接:点击查看
题目大意:给出一张无向完全图,现在要求删除 k 条边,问删除后的最短路的最大值是多少,k 最大是 5
题目分析:很玄学的一道题,数据范围非常小且时间给了 8 秒,比赛时我直接暴力贪心,每次 tarjan 直接找最短路的必经边然后删除,但过了样例却返回了 WA ,然后就自闭了,看了题解之后真的感觉非常奇妙
读完题后就注意到题目中说了所有的边权均是随机数,题解说因为随机数的期望都是一样的,最短路求出后每次只有一条,且涉及到的边数非常少,其他的反例的几率非常非常小,这样可以对每一层进行爆搜,时间复杂度为 c^k * n^2,c 为最短路的边数
然后实现就好了,注意要用朴素的 n * n 的迪杰斯特拉而不是堆优化的,因为堆优化的时间复杂度为 ( n + m ) * logm ,在这个题中显然不如 n * n 的要表现优秀
至于找最短路上的边,我是参考了 std 记录每个点的前驱来实现的,换句话说每次最短路有且仅有一条(不会证明),当然也可以正反各求一次最短路,然后 n * n 去枚举每条边判断是否位于最短路上,不知道会不会超时
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=55;int maze[N][N],pre[6][N],d[N],ans,n;bool vis[N];void Dijkstra(int k)
{memset(d,inf,sizeof(int)*(n+5));memset(vis,false,n+5);d[1]=0;for(int i=1;i<n;i++){int mmin=inf,u=-1;for(int j=1;j<=n;j++)if(!vis[j]&&d[j]<mmin){mmin=d[j];u=j;}vis[u]=true;for(int v=1;v<=n;v++)if(d[v]>d[u]+maze[u][v]){d[v]=d[u]+maze[u][v];pre[k][v]=u;}}
}void dfs(int k)
{Dijkstra(k);if(!k){ans=max(ans,d[n]);return;}int pos=n;while(pos!=1){int u=pos,v=pre[k][pos];int temp=maze[u][v];maze[u][v]=maze[v][u]=inf;dfs(k-1);maze[u][v]=maze[v][u]=temp;pos=pre[k][pos];}
}int main()
{
#ifndef ONLINE_JUDGE
// freopen("data.in.txt","r",stdin);
// freopen("data.out.txt","w",stdout);
#endif
// ios::sync_with_stdio(false);int w;cin>>w;while(w--){int k;scanf("%d%d",&n,&k);for(int i=1;i<=n*(n-1)/2;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);maze[u][v]=maze[v][u]=w;}ans=0;dfs(k);printf("%d\n",ans);}return 0;
}
HDU多校3 - 6797 Tokitsukaze and Rescue(dfs+最短路)相关推荐
- 杭电多校3-Hdu6797 Tokitsukaze and Rescue
HDU多校3 - 6797 Tokitsukaze and Rescue(dfs+最短路) 题目链接:点击跳转 Problem Description Princess CJB has lived a ...
- 权值线段树小结(hdu多校,普通平衡树,郁闷的出纳员)
之前刷了一点主席树的题目,但是没有系统的做过权值线段树的题目.主席树是多根权值线段树的综合.权值线段树可以解决在总区间里求第k大的问题.在普通的线段树里,我们每一个节点维护的是权值大小.但是在权值线段 ...
- HDU 多校 6400 Parentheses Matrix(构造)
HDU 多校 6400 Parentheses Matrix(构造) // Problem: D. Parentheses Matrix // Contest: Codeforces - 2018 C ...
- 2018 HDU多校第四场赛后补题
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...
- hdu1242 Rescue DFS(路径探索题)
hdu1242 Rescue DFS(路径探索题) 这里我定义的路径探索题指 找某路能够到达目的地,每次走都有方向,由于是探索性的走 之后要后退 那些走过的状态都还原掉 地址:http://acm.h ...
- HDU多校4 - 6989 Didn‘t I Say to Make My Abilities Average in the Next Life?!(单调栈)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,再给出 mmm 次询问,每次询问给出一个区间 [l,r][l,r][l,r],要求输出区间 [l,r][l,r][l,r] 内 " ...
- HDU多校4 - 6992 Lawn of the Dead(线段树+模拟)
题目链接:点击查看 题目大意:给出一个 n∗mn*mn∗m 的矩阵,有 kkk 个点被 banbanban 掉了,现在从点 (1,1)(1,1)(1,1) 出发,只能向右或向下移动,问可以到达的点有多 ...
- HDU多校1 - 6959 zoto(莫队+树状数组/值域分块)
题目链接:点击查看 题目大意:在二维平面内有 nnn 个点,表示为 (i,f[i])(i,f[i])(i,f[i]),需要回答 mmm 次询问,每次询问会给出一个矩形,问矩形内有多少个不同的 yyy ...
- HDU多校3 - 6975 Forgiving Matching(多项式匹配字符串)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串 sss 和一个长度为 mmm 的字符串 ttt.规定 kkk 匹配的意思是,两个长度相同的字符串至多有 kkk 个位置是不同的,特别的, ...
最新文章
- python项目了解_神级程序员都是这样来开源 Python 项目!今天算是涨知识了!
- 想获得50亿专项激励?关于穿山甲新星助推计划你必须了解的几件事
- MyBatis的入门知识
- 8.Verilog的for循环语句使用
- AMD迎接变革:加速OpenCL的未来
- java 线程安全问题_java线程安全问题原因及解决办法
- 适合做短视频电商的人群分类
- nekohtml 用法
- 用Java语言编写ajax设计模式_《松本行弘的程序世界》读书笔记(上)——面向对象、程序块、设计模式、ajax...
- matlab中普通电感,matlab电感在哪
- Linux内核抢占机制(preempt)
- IDR:通过迭代数据细化的自我监督图像去噪
- 9 Kong LVS 均衡负载
- 网页制作:一个简易美观的登录界面
- 搭建短域/短链接跳转平台
- NICO EXCHANGE NICO 交易所系統維護公告
- presto 剖析详解
- Position Calc TdPositionCanClose Error
- 2023年中国人民大学信息资源管理学院信息分析考研上岸前辈经验
- 【论文阅读】【三维目标检测】Part-A^2Net