首页 > 其他分享 >洛谷 - P6190

洛谷 - P6190

时间:2024-07-15 21:08:29浏览次数:19  
标签:node 洛谷 P6190 int 矩阵 rd 权值 dp

题目大意

给定 n点m边带权有向图,从 1 到 \(n\) 的路径中,经过一条边时可让其权值变为相反数,再变为原权值,求路径最小权值。

分析

先用 \(Floyd\) 求出全源最短路。
借用 \(Floyd\) 数组列出 \(dp\) 状态,\(f_{i,j}\) 表示从 \(i\) 到 \(j\) 的最短路权值。
但似乎进行不下去了,我们不妨将边反转的数量加入 \(dp\) 状态中。
状态变为 \(f_{k,i,j}\) 表示用了 从 \(i\) 到 \(j\) 的路径上反转了 \(k\) 次的权值。
发现转移方程大概可以写成这样 $$dp_{i,x,k_1}+dp_{y,j,k_2}-w(x,y) \rightarrow dp_{i,j,k_1+k_2+1}$$
发现这十分类似与快速幂的形式!而且 \(max,+\) 具有结合律。
我们成功找到解题关键,关于图论题目可以用矩阵快速幂解决。
现在问题转化为了如何构造矩阵。
考虑在求全源最短路的数组上,发现基础矩阵即为 \(f_{1,i,j}\)!可直接 \(O(mn^2)\)求出,接下来进行广义矩阵快速幂即可,复杂度为 \(O(n^3logk)\),
可以通过此题。

代码

const int N=101,M=2501;
int n,m,k;
int u[M],v[M],w[M];
struct node{
	int a[N][N];
	node(){memset(a,0x3f,sizeof(a));}
	friend node operator *(node x,node y){
		node z;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				for(int k=1;k<=n;k++)
				z.a[i][j]=min(z.a[i][j],x.a[i][k]+y.a[k][j]);
		return z;
	}	
}a,b;
node power(node x,int y){
	node ans=a;
	while(y){
		if(y&1) ans=ans*x;
		x=x*x;y>>=1;
	}
	return ans;
}
signed main(){
	n=rd(),m=rd(),k=rd();
	for(int i=1;i<=m;i++){
		u[i]=rd(),v[i]=rd(),w[i]=rd();
		a.a[u[i]][v[i]]=w[i];
	}
	for(int i=0;i<=n;i++) a.a[i][i]=0;
	for(int t=1;t<=n;t++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				a.a[i][j]=min(a.a[i][j],a.a[i][t]+a.a[t][j]);
	if(!k) return cout<<a.a[1][n],0;
	for(int t=1;t<=m;t++){
		int val=w[t];
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				b.a[i][j]=min(b.a[i][j],min(a.a[i][j],a.a[i][u[t]]+a.a[v[t]][j]-val));
			}
		}
	}
	cout<<power(b,k).a[1][n];
	return 0;
}

标签:node,洛谷,P6190,int,矩阵,rd,权值,dp
From: https://www.cnblogs.com/smilemask/p/18303969

相关文章

  • 『比赛记录』【LGR-193】洛谷 7 月月赛 I×ABC 362
    最舒服的一集「CROI·R2」在相思树下I想了好久还是决定把这道题也写一下,毕竟赛事花了\(40min\)才解决。思路开比赛,看题面,很快啊,打了一个双端队列的做法,结果MLE,然后人傻了二十分钟。之后缓过神来开始推式子。我们把答案先看做操作后的第一个数,提供一个样例:\[2\,\,......
  • 【题解】洛谷 P10765 「CROI · R2」在相思树下 I
    I题意简述共\(T\)组测试数据。对于每一组测试数据,有初始数列,共\(n\)个元素,从\(1\)至\(n\)。给出\(k\)次操作。操作一:将数列中下标为奇数的数全部删除;操作二:将数列中下标为偶数的数全部删除。完成操作之后,将剩余的数从下标\(1\)开始依次重新编排下标。求问\(k\)次......
  • 洛谷 P6522 [CEOI2010 day2] tower 题解
    [CEOI2010day2]tower题目背景古巴比伦人决定建造一座塔。题目描述这座塔共有\(n\)层,每层由一个边长为\(a_i\)的立方体石块构成。一个石块\(i\)能够直接放在石块\(j\)上当且仅当\(a_i\leqa_j+D\),其中\(D\)为一个给定的常数。你需要求出如果使用全部的石块,有多......
  • 洛谷 P2478 [SDOI2010] 城市规划 题解
    题意简述仙人掌上求至少间隔两个位置的最大独立集。(仙人掌指,没有一条边在两个或以上的环里的无向图。)题目分析仙人掌就是树套环,即树上每个结点都是一个结点或环。那么将题目拆解成树上DP和环上DP即可。用tarjan缩点即可。树上DP先来看看树上DP。显然每个点有三个状......
  • 【洛谷】P5728 【深基5.例5】旗鼓相当的对手——C++
    本题感想:本题主要是应该避免重复比较,以a,b,c,d为例,我们假设先a不动,依次比较d,c,b或者b,c,d,然后假设b不动,依次比较c,d,最后假设c不动,比较d,这样这道题就差不多解决了#include<iostream>#include<cmath>usingnamespacestd;intmain(){inta[1010][3],s[1010]={0......
  • 如何正确的写文章(转载自洛谷)
    本文将会对Markdown和LaTeX的语法进行深入解读,旨在教会阅读本文的读者正确使用Markdown和LaTeX书写博客或题解。本文将会通过正反对比的方式,指出一些做法的错误之处,并给出相应的正确做法。笔者假设将要读本文的读者已经掌握了Markdown和LaTeX的语法。如果您还不熟悉......
  • 洛谷B3644 【模板】拓扑排序 / 家谱树
    传送门Abstract这篇题解主要介绍如何使用BFS去实现拓扑排序。Idea见下方注释Code#include<bits/stdc++.h>usingnamespacestd;intn;//记录点的数量intin[105];//记录点的入度vector<vector<int>>sons;//记录每个点的儿子......
  • 洛谷P1347 排序
    传送门Abstract这篇题解主要介绍了拓扑排序的唯一性问题和存在性问题。Idea要想解决这题需要考虑到一下两点:拓扑排序的核心思路在于将所有入度为0的点一次加入序列,如果在某一个时刻图中存在多个入度为0的点,那么我们将无法判断它们的先后顺序,此时,拓扑序列就不唯一了。假设......
  • 洛谷CF1342B Binary Period题解
    原题解和原题。这道题比较水。这道题分两种情况,分别为$t$由一种字符构成和由两种字符构成两种情况。$t$只有$0$或$1$。此时的$k$就是$1$,直接输出$t$就是最好的选择。$t$既有$0$又有$1$。此时的$k$为$2$,字符串由01或10构成。我们设$a_i$为字符串......
  • 洛谷P1073 最优贸易 (分层图)
    题意:多个节点,起点到终点,每个点可以买或卖水晶球,每个点水晶球的价格不一样(买卖价格相同)。问最多买卖一次,能赚取最高多少差价?(在赚不到差价的情况下他就无需进行贸易)。思路:“这个'b'题,我不看题解我是想不出来,但是确实是个很好的题”。有两种做法,双向spfa和分层图,我就只说分层图做法(......