【GDOI2014模拟】旅行 题解代码
原题
Description
从前有一位旅者,他想要游遍天下所有的景点。这一天他来到了一个神奇的王国:在这片土地上,有n个城市,从1到n进行编号。王国中有m条道路,第i条道路连接着两个城市ai,bi,由于年代久远,所有的道路都已经不能使用。如果要修复第i条道路,需要wi的时间。为了更好的旅行,旅者想要将某些道路修复,使得1号城市能够到达n号城市,2号城市能够到达n-1号城市..k号城市能够到达n-k+1号城市。为了满足他的要求,请问最少需要多少时间去修复道路。无解请输出-1。
Input
第一行:n,m,k
接下来m行:ai,bi,wi
含义如上所述。
Output
输出共一行:最少需要多少时间修复道路。如果始终无法满足旅者的要求,请输出-1。
Sample Input
5 5 2
1 3 4
3 5 2
2 3 1
3 4 4
2 4 3
Sample Output
9
Data Constraint
20%的数据满足:k <= 2, n<= 10, m <= 20
40%的数据满足:k <= 3, n<=100, m<=1000
70%的数据满足:k<=4, n<=1000, m<=1000
100%的数据满足:k<=4, n<=10000, m<=10000, n >= 2*k, wi<= 1000, 1 <= ai, bi <= n
Hint
样例解释:
题目大意
给出n个点,m条带权双向边,和一个整数k。
k≤4,n≤10000,m≤10000k\leq4, n\leq10000, m\leq10000
让你连接其中一些边,使得1号城市能够到达n号城市,2号城市能够到达n-1号城市…k号城市能够到达n-k+1号城市。
求最少的边权。若不能满足则输出-1。
题解
用每一种1~k的顺序(即 K的全排列)来对每一个 i(1≤\leqi≤\leqk)操作。
用单源最短路算法SPFA求出点 i 到点 n-i+1 的最短距离。
再把最短路径上的每一条边的权值赋为0。
统计最小答案即可。以下为代码:
Code
#include<cstdio>
#include<cstring>
using namespace std;
const int N=10001;
int ans,tot,dis[N],f[N],que[3*N],h[24][4];
int first[N],next[2*N],en[2*N],w[2*N],w1[2*N];
bool bz[N];
inline int read()
{int data=0; char ch=0;while(ch<'0' || ch>'9') ch=getchar();while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();return data;
}
inline void add(int x,int y,int z)
{next[++tot]=first[x];first[x]=tot;en[tot]=y;w[tot]=z;
}
inline void dfs(int x,int y)
{if(x==y){for(int i=0;i<y;i++) h[tot][i]=f[i+1];tot++;return;}for(int i=1;i<=y;i++)if(!bz[i]){bz[i]=true;f[++f[0]]=i;dfs(x+1,y);f[f[0]--]=0;bz[i]=false;}
}
int main()
{int n=read(),m=read(),q=read();for(int i=1;i<=m;i++){int x=read(),y=read(),z=read();add(x,y,z);add(y,x,z);}tot=0;dfs(0,q); //全排列ans=1e7;for(int i=0;i<tot;i++){int sum=0,w1[2*N];memcpy(w1,w,sizeof(w1));for(int j=0;j<q;j++){memset(dis,60,sizeof(dis));memset(bz,false,sizeof(bz));memset(f,0,sizeof(f));int head=dis[h[i][j]]=0,tail=1;que[tail]=h[i][j];while(head<tail){bz[que[++head]]=false;for(int k=first[que[head]];k;k=next[k])if(dis[en[k]]>dis[que[head]]+w1[k]){dis[en[k]]=dis[que[head]]+w1[k];f[en[k]]=que[head];if(!bz[en[k]]) bz[que[++tail]=en[k]]=true;}} //此处为SPFAif(dis[n-h[i][j]+1]>1e7){printf("-1");return 0;} //无解sum+=dis[n-h[i][j]+1];for(int t=n-h[i][j]+1;t!=f[h[i][j]];t=f[t]){for(int k=first[f[t]];k;k=next[k])if(en[k]==t){w1[k]=0;break;}for(int k=first[t];k;k=next[k])if(en[k]==f[t]){w1[k]=0;break; }} //边赋为0}if(sum<ans) ans=sum;}printf("%d",ans);return 0;
}
【GDOI2014模拟】旅行 题解代码相关推荐
- [CQOI2012]模拟工厂 题解(搜索+贪心)
[CQOI2012]模拟工厂 题解(搜索+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327574 链接题目地址:洛谷P3161 BZOJ P26 ...
- 【蓝桥备赛冲刺】2022年第十三届省赛模拟题题解C/C++
食用该篇博客前须知: (0)第一次写博客,如有地方处理不好请见谅,后续会不断提高自己的写博客能力. (1)在头文件处偷了懒,使用的都是万能头文件.(最好还是自己要记住常用头文件 (2)使用的是C++, ...
- 第一届『Citric杯』NOIP提高组模拟赛 题解
[官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...
- 计蒜客2020蓝桥杯大学A组模拟赛题解
计蒜客2020蓝桥杯大学A组模拟赛题解 蓝桥杯的话,去年拿了C++组的国二.今年报名了新成立的Python组,不知道能不能摸到国一的鱼 模拟赛链接如下: https://www.jisuanke.co ...
- php模拟QQ登录获得skey码,php模拟qq登录代码
php模拟qq登录代码 本文讲述了php如何模拟qq登录,原理是用curl模拟发送post登录,cookie保存本地,这里代码理论可以支持永久单挂qq,下面就让我们来看看吧.<?php $qqn ...
- HTML绘制齿轮,HTML5模拟齿轮动画代码实例
HTML代码 css代码#level{ width:100%; height:1px; position:absolute; top:50%; } #content{ text-align:cente ...
- 2021年 第十二届蓝桥杯第二期校内模拟赛题解(Java版)
时隔多日,终于会写一些简单DP了哈哈哈! 稍微改版,方便阅读,若有错,请指出 2019年 第十届蓝桥杯省赛题解(JavaB组版) 2020年 第十一届蓝桥杯第一场省赛题解(JavaB组版) 2020年 ...
- FPGA数字IC刷题58道Verilog题解代码及视频讲解【FPGA探索者】【同步/异步FIFO】【跨时钟】
牛客 Verilog 刷题入门篇1~24 + 进阶篇1~34 题解代码,所有代码均能通过测试,配合视频讲解效果更佳.为避免内容冗余,本文只给出代码,部分题目给出必要说明. 很多题目本身出题有些问题,着 ...
- C++小木棍题解代码(备用)
C++小木棍题解代码(备用) #include<iostream> #include<cstdio> #include<cstring> #include<a ...
最新文章
- Boost:boost :: bind相等运算符的测试程序
- win2008下的无线网卡设置
- mysql8安装后初始化密码
- win7功能找不到信息服务器,win7系统找不到Internet信息服务的解决方法
- docker 覆盖 entrypoint_最佳实践,Dockerfile中ENTRYPOINT与CMD指令的区别与建议
- 前端学习(1046):todolist删除数据1
- 信捷伺服刚性调整_信捷電氣(603416):伺服與PLC增長將加速,口罩機解決方案帶來新增量...
- Mimikatz 攻防杂谈
- HTML5新标签-Video
- 计算机控制课设串级回路,计算机控制系统课程设计
- AndroidX全解析
- bzoj3097 Hash Killer I
- java qua_Qua Vadis Eclipse? 第二部分
- 强化学习 原理与Python实现(四)
- 基于微信点餐外卖小程序系统设计与实现 开题报告
- 《沧海一声笑》简谱图修正版
- AD16弹出错误对话框
- LeetCode 885 救生艇
- torch.contiguous()方法
- 关于ORACLE索引