原题

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模拟】旅行 题解代码相关推荐

  1. [CQOI2012]模拟工厂 题解(搜索+贪心)

    [CQOI2012]模拟工厂 题解(搜索+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327574 链接题目地址:洛谷P3161 BZOJ P26 ...

  2. 【蓝桥备赛冲刺】2022年第十三届省赛模拟题题解C/C++

    食用该篇博客前须知: (0)第一次写博客,如有地方处理不好请见谅,后续会不断提高自己的写博客能力. (1)在头文件处偷了懒,使用的都是万能头文件.(最好还是自己要记住常用头文件 (2)使用的是C++, ...

  3. 第一届『Citric杯』NOIP提高组模拟赛 题解

    [官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...

  4. 计蒜客2020蓝桥杯大学A组模拟赛题解

    计蒜客2020蓝桥杯大学A组模拟赛题解 蓝桥杯的话,去年拿了C++组的国二.今年报名了新成立的Python组,不知道能不能摸到国一的鱼 模拟赛链接如下: https://www.jisuanke.co ...

  5. php模拟QQ登录获得skey码,php模拟qq登录代码

    php模拟qq登录代码 本文讲述了php如何模拟qq登录,原理是用curl模拟发送post登录,cookie保存本地,这里代码理论可以支持永久单挂qq,下面就让我们来看看吧.<?php $qqn ...

  6. HTML绘制齿轮,HTML5模拟齿轮动画代码实例

    HTML代码 css代码#level{ width:100%; height:1px; position:absolute; top:50%; } #content{ text-align:cente ...

  7. 2021年 第十二届蓝桥杯第二期校内模拟赛题解(Java版)

    时隔多日,终于会写一些简单DP了哈哈哈! 稍微改版,方便阅读,若有错,请指出 2019年 第十届蓝桥杯省赛题解(JavaB组版) 2020年 第十一届蓝桥杯第一场省赛题解(JavaB组版) 2020年 ...

  8. FPGA数字IC刷题58道Verilog题解代码及视频讲解【FPGA探索者】【同步/异步FIFO】【跨时钟】

    牛客 Verilog 刷题入门篇1~24 + 进阶篇1~34 题解代码,所有代码均能通过测试,配合视频讲解效果更佳.为避免内容冗余,本文只给出代码,部分题目给出必要说明. 很多题目本身出题有些问题,着 ...

  9. C++小木棍题解代码(备用)

    C++小木棍题解代码(备用) #include<iostream> #include<cstdio> #include<cstring> #include<a ...

最新文章

  1. Boost:boost :: bind相等运算符的测试程序
  2. win2008下的无线网卡设置
  3. mysql8安装后初始化密码
  4. win7功能找不到信息服务器,win7系统找不到Internet信息服务的解决方法
  5. docker 覆盖 entrypoint_最佳实践,Dockerfile中ENTRYPOINT与CMD指令的区别与建议
  6. 前端学习(1046):todolist删除数据1
  7. 信捷伺服刚性调整_信捷電氣(603416):伺服與PLC增長將加速,口罩機解決方案帶來新增量...
  8. Mimikatz 攻防杂谈
  9. HTML5新标签-Video
  10. 计算机控制课设串级回路,计算机控制系统课程设计
  11. AndroidX全解析
  12. bzoj3097 Hash Killer I
  13. java qua_Qua Vadis Eclipse? 第二部分
  14. 强化学习 原理与Python实现(四)
  15. 基于微信点餐外卖小程序系统设计与实现 开题报告
  16. 《沧海一声笑》简谱图修正版
  17. AD16弹出错误对话框
  18. LeetCode 885 救生艇
  19. torch.contiguous()方法
  20. 关于ORACLE索引

热门文章

  1. matlab中svd函数用法总结
  2. 一张图解释几个监督学习的定义
  3. 纯Python包发布setup脚本编写示例
  4. 【转】C++读写.mat文件的方法
  5. 高并发02_同步锁的一些题目
  6. ustc小道消息20211220
  7. 科大星云诗社动态20210325
  8. 云炬Android开发笔记 2-1项目初始化
  9. 扫描过程_高考试卷扫描、阅卷过程以及答题过程注意的事项
  10. VTK修炼之道35:边缘检测_Laplace算子