将边按权值从小到大排序。

考虑一条路径,一定是最大的若干条边和最小的相应的没选的边进行交换。

这会导致存在一个分界线$L$,交换之后恰好选中前$L$小的边,且只允许$>L$的边与$\leq L$的边进行交换。

枚举$L$,设$f[i][j][k]$表示从$1$到$i$,经过了$j$条前$L$小的边,舍弃了$k$条$>L$的边时,$>L$且未舍弃的边权和的最小值。

用Dijkstra算法求出$f$,更新答案即可。

时间复杂度$O((n+m)m^2k)$。

#include<cstdio>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<int,int>P;
const int N=55,M=155,inf=~0U>>1;
int n,m,K,i,j,k,L,g[N],v[M<<1],nxt[M<<1],ed,base,ans=inf,f[N][M][22];
priority_queue<P,vector<P>,greater<P> >q;
struct E{int x,y,w;}e[M];
inline bool cmp(const E&a,const E&b){return a.w<b.w;}
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
inline void ext(int x,int y,int z,int w){
if(y>L||z>K)return;
if(f[x][y][z]<=w)return;
q.push(P(f[x][y][z]=w,(x<<13)|(y<<5)|z));
}
int main(){
scanf("%d%d%d",&n,&m,&K);
for(i=1;i<=m;i++)scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].w);
sort(e+1,e+m+1,cmp);
for(ed=i=1;i<=m;i++)add(e[i].x,e[i].y),add(e[i].y,e[i].x);
for(L=0;L<=m;L++){
base+=e[L].w;
if(base>=ans)break;
for(i=1;i<=n;i++)for(j=0;j<=L;j++)for(k=0;k<=K;k++)f[i][j][k]=inf;
ext(1,0,0,base);
while(!q.empty()){
P t=q.top();q.pop();
int z=t.second&31;t.second>>=5;
int y=t.second&255;t.second>>=8;
int x=t.second;
if(f[x][y][z]<t.first)continue;
for(i=g[x];i;i=nxt[i])if((i>>1)<=L)ext(v[i],y+1,z,t.first);
else{
ext(v[i],y,z,t.first+e[i>>1].w);
ext(v[i],y,z+1,t.first);
}
}
for(j=0;j<=L;j++)for(k=0;k<=K;k++)if(j+k<=L&&f[n][j][k]<ans)ans=f[n][j][k];
}
return printf("%d",ans),0;
}

  

BZOJ4681 : [Jsoi2010]旅行的更多相关文章

  1. 题解【洛谷P6029】[JSOI2010]旅行

    题面 简化版题意:给出 \(n\) 个点 \(m\) 条边的无向图,可以交换任意两条边的权值 \(k\) 次,求 \(1\) 结点到 \(n\) 结点的最短路. 考虑\(\text{DP}\). 把所 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. 「JSOI2010」旅行

    「JSOI2010」旅行 传送门 比较妙的一道 \(\text{DP}\) 题,思维瓶颈应该就是如何确定状态. 首先将边按边权排序. 如果我们用 \(01\) 串来表示 \(m\) 条边是否在路径上, ...

  4. BZOJ 3531: [Sdoi2014]旅行 [树链剖分]

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1685  Solved: 751[Submit][Status] ...

  5. vijos P1780 【NOIP2012】 开车旅行

    描述 小\(A\)和小\(B\)决定利用假期外出旅行,他们将想去的城市从\(1\)到\(N\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为 ...

  6. 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流

    1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 388  Solved: 212[Submit ...

  7. codevs 1036 商务旅行(Targin求LCA)

    传送门 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意 ...

  8. nyoj 71 独木舟上的旅行(贪心专题)

    独木舟上的旅行 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客 ...

  9. 【bzoj3531】 [SDOI2014]旅行

    题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...

随机推荐

  1. MS-DOS运行java工程

    D:\SourceCode\mailProxy\out\production\examples>java -classpath .;org\roger\stud y\mailClient;D:\ ...

  2. Leetcode刷题第004天

    class Solution { public: int findKthLargest(vector<int>& nums, int k) { , nums.size()-, k) ...

  3. Android Studio 修改包名最便捷做法

    Android Studio,咱们开发安卓的利器,自推出就受到移动开发者的追捧,但一路走来,大家谈到他,充满了兴奋之情之余,也略显羞涩.随版本自推出以来,不断完善BUG,但咱们还是深深地踩了进去,说多 ...

  4. 使用jquery.more.js上滑加载更多

    html: <div id="more"> <div class="single_item"> <div class=" ...

  5. BZOJ5084[hashit]

    题解: 后缀自动机 我们可以通过建立trie 把询问变成询问一些点的并 把trie建立成SAM和广义SAM基本相同,就是在父亲和儿子之间连边 然后就变成了询问树链的并 我们可以发现答案=sigma d ...

  6. Tychonov Theorem

    (Remark: The proof presented in this post is a reorganization and interpretation of that given by Ja ...

  7. 修改tomcat的默认访问日志信息

    修改前:

  8. Linux拷贝U盘文件(命令行)

    Linux系统有的有界面,有的没有只要命令窗口,因此导入外部文件就变得困难,没有可视化的方便. 这里通过挂载u盘进行文件拷贝. 首先挂载u盘:这里以centos为例 1.进入命令行模式下,输入命令 s ...

  9. 035 控制并发 select * from test1 where id =1 for update 就会对这行加锁了?

    今天在看同事程序的时候,看到这种用法,顺便学习下. 一:理论 1.功能 这个功能是上锁. 上的是一个排它锁,也就是说,其他的事务是可以读取的.但是不能写入或者更新. 二:实践 1.创建表 2.提交一条 ...

  10. CSS选择器 + Xpath + 正则表达式整理(有空再整理)

    选择器 例子 例子描述 CSS .class .intro 选择 class="intro" 的所有元素. 1 #id #firstname 选择 id="firstna ...