YbtOJ#893-带权的图【高斯消元,结论】
正题
题目链接:https://www.ybtoj.com.cn/problem/893
题目大意
给出一张\(n\)个点\(m\)条边的无向联通图,每条边正反向各有\(A,B,C\)三种边权。
保证满足
\]
\]
且对于每个环\([v_1,v_2...v_n](v_1=v_n)\)
\]
现在给你\(A,B\)边权,求\(C\)边权。
数据保证解唯一,所有限制都在模\(P\)意义下
\(n\in[1,100],m\in[1,2000],P\in[1,10^{18}]\cup Pri\)
解题思路
最后一个环的限制很麻烦,因为环很多。
先考虑原图的任意一颗生成树\(T\)上,对于任意一条非树边\((u,v)\)可以表示一个\(u->v->u\)的环。并且因为反过来走边权为负,所以你可以通过用一些小环相互抵消出一个大环。
结论就是所有的环都可以被一些用非树边表示的环相互抵消表示。所以我们就可以将环的数量减少到\(O(m)\)级别了。
暴力消元\(O(m^3)\)显然无法通过本题,我们还需要优化。
设\(D_{x,y}=B_{x,y}\times C_{x,y}-A_{x,y}\),那么第一个条件就表示成了每个环\(D\)的和为\(0\)。
并且还能发现一个性质,对于一个非树边表示的环\((x,y)\),
\]
(其中\(path(x,y)\)表示树上路径\(x,y\)的\(D\)值和)
所以可以证明从\(x\)走到\(y\)的所有路径权值相同
那么我们可以设\(f_x=path(1,x)\),那么\(D_{x,y}=f_y-f_x\)。
这样对于每个点就可以根据\(C\)的限制列出一个方程
\]
然后高斯消元即可,时间复杂度\(O(n^3)\)
注意模数比较大,要写龟速乘
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=110;
struct node{
	ll x,y,a,b;
}e[N*20];
ll n,m,P,f[N];
ll mul(ll a,ll b){
	a%=P;b%=P;
	ll tmp=(long double)a*b/P;
	long double ans=a*b-tmp*P;
	if(ans>=P)ans-=P;
	else if(ans<0)ans+=P;
	return ans;
}
ll power(ll x,ll b){
	ll ans=1;
	while(b){
		if(b&1)ans=mul(ans,x);
		x=mul(x,x);b>>=1;
	}
	return ans;
}
namespace G{
	ll a[N][N],b[N];
	void solve(ll *f){
		for(ll i=1;i<=n;i++){
			ll p=i;
			for(ll j=i;j<=n;j++)
				if(a[j][i]){p=j;break;}
			swap(a[i],a[p]);swap(b[i],b[p]);
			ll inv=power(a[i][i],P-2);b[i]=mul(b[i],inv);
			for(ll j=i;j<=n;j++)a[i][j]=mul(a[i][j],inv);
			for(ll j=i+1;j<=n;j++){
				ll rate=P-a[j][i];
				for(ll k=i;k<=n;k++)
					a[j][k]=(a[j][k]+mul(rate,a[i][k]))%P;
				b[j]=(b[j]+mul(rate,b[i]))%P;
			}
		}
		for(ll i=n;i>=1;i--){
			for(ll j=i+1;j<=n;j++)
				(b[i]+=P-mul(b[j],a[i][j]))%=P;
			f[i]=b[i];
		}
		return;
	}
}
signed main()
{
	freopen("graph.in","r",stdin);
	freopen("graph.out","w",stdout);
	scanf("%lld%lld%lld",&n,&m,&P);
	for(ll i=1;i<=m;i++)
		scanf("%lld%lld%lld%lld",&e[i].x,&e[i].y,&e[i].a,&e[i].b);
	for(ll i=1;i<=m;i++){
		ll x=e[i].x,y=e[i].y,a=e[i].a,b=e[i].b;b=power(b,P-2);
		(G::a[x][y]+=b)%=P;(G::a[x][x]+=P-b)%=P;(G::b[x]+=P-mul(a,b))%=P;
		swap(x,y);a=P-a;
		(G::a[x][y]+=b)%=P;(G::a[x][x]+=P-b)%=P;(G::b[x]+=P-mul(a,b))%=P;
	}
	for(ll i=1;i<=n;i++)G::a[1][i]=0;
	G::a[1][1]=1;G::b[1]=0;G::solve(f);
	for(ll i=1;i<=m;i++){
		ll x=e[i].x,y=e[i].y,a=e[i].a,b=e[i].b;b=power(b,P-2);
		printf("%lld\n",mul((f[y]-f[x]+a+P)%P,b));
	}
	return 0;
}
YbtOJ#893-带权的图【高斯消元,结论】的更多相关文章
- 4.23 子串 AC自动机 概率期望 高斯消元
		考虑40分. 设出状态 f[i]表示匹配到了i位还有多少期望长度能停止.可以发现这个状态有环 需要高斯消元. 提供一种比较简单的方法:由于期望的线性可加性 可以设状态f[i]表示由匹配到i到匹配到i+ ... 
- POJ 2947-Widget Factory(高斯消元解同余方程式)
		题目地址:id=2947">POJ 2947 题意:N种物品.M条记录,接写来M行,每行有K.Start,End,表述从星期Start到星期End,做了K件物品.接下来的K个数为物品的 ... 
- [CF963E]Circles of Waiting[高斯消元网格图优化+期望]
		题意 你初始位于 \((0,0)\) ,每次向上下左右四个方向走一步有确定的概率,问你什么时候可以走到 以 \((0,0)\)为圆心,\(R\) 为半径的圆外. \(R\le 50\) 分析 暴力 \ ... 
- Educational Codeforces Round 63 (Rated for Div. 2) E 带模高斯消元
		https://codeforces.com/contest/1155/problem/E 题意 \(f(x)=a_0+a_1x+a_2x^2+...+a_kx^k,k \leq 10,0 \leq ... 
- BZOJ 3143 HNOI2013 游走 高斯消元 期望
		这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 不过笔者在做完后发现了一些问题,在原文的后面进行了说明. 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号 ... 
- bzoj 2115: [Wc2011] Xor xor高斯消元
		2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 797 Solved: 375[Submit][Status] ... 
- 线性空间和异或空间(线性基)bzoj4004贪心+高斯消元优秀模板
		线性空间:是由一组基底构成的所有可以组成的向量空间 对于一个n*m的矩阵,高斯消元后的i个主元可以构成i维的线性空间,i就是矩阵的秩 并且这i个主元线性无关 /* 每个向量有权值,求最小权极大线性无关 ... 
- BZOJ 3143 游走(贪心+期望+高斯消元)
		一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分 ... 
- 【BZOJ】2337: [HNOI2011]XOR和路径 期望+高斯消元
		[题意]给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值.n<=100,wi<=10^9. [算法]期望+高斯消元 [题解]首先异或不 ... 
随机推荐
- Nginx 真实的 IP
			配置 Nginx 如果你的 Java 项目使用了 Nginx 代理,那么还需要进行以下配置,才能顺利获取到真实的 IP,否则只能获取到 127.0.0.1. 在 Nginx 的配置文件里,找到你 Ja ... 
- C# wpf中关于binding的converter无效的情况
			最近碰到bingding设置了convert转换无效的问题.困扰了我好久.这里记录分析一下. 先说下现象 我把TextBox的text属性 绑定到了对应的 convert.代码如下 希望吧pd_no ... 
- python十行代码实现文件去重,去除重复文件的脚本
			导入依赖 '''导入依赖''' from pathlib import Path import filecmp 函数说明 ''' filecmp.cmp(path1, path2, shallow=T ... 
- ASP截取字符 截取字符之间的字符
			ASP截取字符:MID函数Mid(变量或字串符,开始字节, 结尾字节(可不填)) InStrRev(变量, "字串符") 最后出现位置InStr(变量, "字串符&qu ... 
- TCP/IP以及Socket聊天室带类库源码分享
			TCP/IP以及Socket聊天室带类库源码分享 最近遇到个设备,需要去和客户的软件做一个网络通信交互,一般的我们的上位机都是作为客户端来和设备通信的,这次要作为服务端来监听客户端,在这个背景下,我查 ... 
- Git工具的使用教程二
			1.3时光穿梭机--版本回退 版本回退分为两步骤进行操作: 步骤: 1.查看版本,确定需要回到的时候点 指令: git log git log ... 
- MySQL数据库迁移之data目录
			其实迁移数据库,一般用sql文件就行,把A服务器数据库的表结构和数据等等导出,然后导入到B服务器数据库, 但是这次数据文件过大,大约有40个G,使用命令行导入,效果不是很好,经常在执行过程中报错.卡死 ... 
- MySQL密码重置方法
			MySQL数据库的安装和配置,配置Mysql按照bin目录到Path中 使用命令行窗口连接MYSQL数据库:mysql –u用户名 –p密码 对于密码的重置有以下两种方法(卸载重新安装当然也可以): ... 
- Charles-抓取https请求
			在未经设置之前,Charles是无法抓取https请求的,会出现unknown的标识.我们可以通过以下两步设置,解决该问题. 第一步:安装证书 https是在http的基础上加入ssl层,通过ssl来 ... 
- 洛谷P1925 最大划分乘积的数学解法
			题目 最大划分乘积 题解 这道题用到一点导数和数论的知识,很容易看出这道题是求函数 \[f(x)=(\frac{n}{x})^{x} \] ( \(x\) 为正整数)的最大值.我们可以对 \(ln(f ... 
