旅行(travel)

从前有一位旅者,他想要游遍天下所有的景点。这一天他来到了一个神奇的王国:在这片土地上,有n个城市,从1到n进行编号。王国中有m条道路,第i条道路连接着两个城市ai,bi,由于年代久远,所有的道路都已经不能使用。如果要修复第i条道路,需要wi的时间。为了更好的旅行,旅者想要将某些道路修复,使得1号城市能够到达n号城市,2号城市能够到达n-1号城市..k号城市能够到达n-k+1号城市。为了满足他的要求,请问最少需要多少时间去修复道路。无解请输出-1。

输入格式:

第一行:n,m,k
接下来m行:ai,bi,wi
含义如上所述。

输出格式:

输出共一行:最少需要多少时间修复道路。如果始终无法满足旅者的要求,请输出-1。

样例输入:

5 5 2
1 3 4
3 5 2
2 3 1
3 4 4
2 4 3

样例输出:

9

数据范围:

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 

时间限制:

3000

咋一看本题突然就想到要用生成树,然后仔细观察,发现这个k小得莫名其妙,于是弄出了一个暴枚+SPFA的算法,枚举每组i到n-k+i的顺序,再把最短路长度全部清零,取每种排列的最小值。
 #include<iostream>
 #include<queue>
 #include<cstdio>
 #include<cstring>
 using namespace std;
 ;
 struct node{
     int from,to,next,dis,bro;
 }edge[N*];
 ,dis[N],ans=,last[N];
 ],in[N],can=true;
 inline void unite(int x,int y,int w,int b)
 {
     edge[s].from=x;
     edge[s].bro=b;
     edge[s].to=y;
     edge[s].dis=w;
     edge[s].next=head[x];
     head[x]=s;
     return;
 }
 inline ;return;}
 inline void dfs(int step,int res)
 {
     if(step==k)
     {
         ans=min(ans,res);
         return;
     }
     if(!can) return;
     node store[N*];
     ;i<=s;i++) store[i]=edge[i];
     ;
     ;u<=k;u++) )
     {
         used[u]=;
         ) ;i<=s;i++) edge[i]=store[i];
         ;
         queue<int> Q;
         memset(dis,,sizeof(dis));
         memset(last,,sizeof(last));
         ];
         dis[u]=;
         Q.push(u);
         while(!Q.empty())
         {
             int f=Q.front();
             Q.pop();
             ;
             for(int i=head[f];i;i=edge[i].next) if(edge[i].dis+dis[f]<dis[edge[i].to])
             {
                 dis[edge[i].to]=edge[i].dis+dis[f];
                 last[edge[i].to]=i;
                 if(!in[edge[i].to])
                 {
                     Q.push(edge[i].to);
                     ;
                 }
             }
         }
         ]) can=;
         else
         {
             ;
             )
             {
                 del(last[p]);
                 del(edge[last[p]].bro);
                 p=edge[last[p]].from;
             }
             dfs(step+,res+dis[n-u+]);
         }
         used[u]=;
     }
     return;
 }
 int main()
 {
     int x,y,w;
     scanf("%d%d%d",&n,&m,&k);
     ;i<=m;i++)
     {
         scanf("%d%d%d",&x,&y,&w);
         s++;unite(x,y,w,s+);
         s++;unite(y,x,w,s-);
     }
     memset(used,,sizeof(used));
     dfs(,);
     if(!can) printf("-1\n");
     else printf("%d\n",ans);
     ;
 }

GDOI2014模拟 旅行【SPFA】的更多相关文章

  1. 【JZOJ6419】模拟旅行&【BZOJ5506】【luoguP5304】旅行者

    description 某国有n座城市,这些城市之间通过m条单向道路相连,已知每条道路的长度. 不过,小X只对其中k座城市感兴趣. 为了更好地规划模拟旅行路线,提升模拟旅行的体验,小X想要知道他感兴趣 ...

  2. 【GDOI2014模拟】JZOJ2020年8月14日提高组 服务器

    [GDOI2014模拟]JZOJ2020年8月14日提高组 服务器 题目 Time and Memory Limits Description 我们需要将一个文件复制到n个服务器上,这些服务器的编号为 ...

  3. 【GDOI2014模拟】JZOJ2020年8月14日T2 网格

    [GDOI2014模拟]JZOJ2020年8月14日T2 网格 题目 Time and Memory Limits Description 某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标 ...

  4. [JZOJ3400] 【GDOI2014模拟】旅行

    题目 题目大意 给你一个图,让你选择权值和最小的边,使得\(1\)和\(n\),\(2\)和\(n-1\),--,\(K\)和\(n-K+1\)联通. \(K\leq 4\) 思考历程 一看到这题就觉 ...

  5. All Roads Lead to Rome(30)(MAP【int,string】,邻接表,DFS,模拟,SPFA)(PAT甲级)

    #include<bits/stdc++.h>using namespace std;map<string,int>city;map<int,string>rcit ...

  6. GDOI2014模拟pty爬山(mountain)

    pty爬山(mountain) 在Pty学校附近,有一座名之为岳之麓的高山.Pty很喜欢和(哔--)一起爬山.山的平面模型如下:山由一个顶点集:A1,A2-An给定,保证Ai的x单调递增.我们将Ai和 ...

  7. 【GDOI2014模拟】服务器

    前言 直到比赛最后几分钟,才发现60%数据居然是一个水dp,结果没打完. 题目 我们需要将一个文件复制到n个服务器上,这些服务器的编号为S1, S2, -, Sn. 首先,我们可以选择一些服务器,直接 ...

  8. 【GDOI2014模拟】Tree

    题目 Wayne 在玩儿一个很有趣的游戏.在游戏中,Wayne 建造了N 个城市,现在他想在这些城市间修一些公路,当然并不是任意两个城市间都能修,为了道路系统的美观,一共只有M 对城市间能修公路,即有 ...

  9. 【GDOI2014模拟】网格

    题目 某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m.现在从A(0, 0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过图示中直线左上方的 ...

随机推荐

  1. 申请免费的SSL证书(Win7,PowerShell,Let's Encrypt)

    随着网络安全形势的发展,SSL已是各大网站的标配,启用SSL的好处自然不必多说,然后每份SSL证书也要花费不菲的银子,按最便宜的DV证书来看,每年也要个四五百呢. 有趋势有需求,自然也有免费可用.免费 ...

  2. FastDFS+Nginx部署详细教程

    本例使用到的所有tar和zip包地址:http://download.csdn.net/detail/corey_jk/9758664 本例中使用CentOS1.CentOS2两台机器实现. 1 GC ...

  3. JavaScript中国象棋程序(6) - 克服水平线效应、检查重复局面

    "JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第6节. 这一系列共有9个部分: 0.JavaScript中国象 ...

  4. jquery和javascript的区别(常用方法比较)

    jquery 就对javascript的一个扩展,封装,就是让javascript更好用,更简单.人家怎么说的来着,jquery就是要用更少的代码,漂亮的完成更多的功能.JavaScript 与JQu ...

  5. PHP 代码审计代码执行注入

    PHP 代码审计代码执行注入 所谓的代码执行注入就是 在php里面有些函数中输入的字符串参数会当做PHP代码执行. 如此的文章里面就大有文章可以探究了 一 常见的代码执行函数 Eval,assert, ...

  6. linux c++ 加载动态库常用的三种方法

    链接库时的搜索路径顺序:LD_LIBRARY_PATH --> /etc/ld.so.conf --> /lib,/usr/lib 方法1. vi .bash_profile    设置环 ...

  7. SaberRD之交流分析

    交流分析(AC Analysis)也叫做小信号(Small-Signal)分析,也即分析电路的小信号频率响应,更严谨的定义是:分析工作在直流偏置电压下的非线性电路对于一定频率范围内的输入小信号的系统响 ...

  8. 每天一个Linux命令(20)--find命令之exec

    find 是我们很常用的一个Linux命令,但是我们一般查找出来的额并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了. exec解释: -exec  参数后面跟的是 comm ...

  9. 每天一个Linux命令(05)--rm命令

    自从学会了用mkdir创建目录之后,整个系统里就只能看到一堆空目录了,囧~ 那么今天我们来学一下如何清理这些空目录吧--rm命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录 ...

  10. MyBatis从入门到放弃一:从SqlSession实现增删改查

    前言 开博客这是第一次写系列文章,从内心上讲是有点担心自己写不好,写不全,毕竟是作为java/mybatis学习的过程想把学习的路线和遇到的问题都总结下来,也让知识点在脑海里能形成一个体系. 开发环境 ...