YbtOJ#893-带权的图【高斯消元,结论】

正题

题目链接:https://www.ybtoj.com.cn/problem/893


题目大意

给出一张nnn个点mmm条边的无向联通图,每条边正反向各有A,B,CA,B,CA,B,C三种边权。
保证满足
Ax,y=−Ay,x,Bx,y=By,x,Cx,y=−Cy,xA_{x,y}=-A_{y,x}\ ,\ B_{x,y}=B_{y,x}\ ,\ C_{x,y}=-C_{y,x}Ax,y=Ay,x , Bx,y=By,x , Cx,y=Cy,x
∑x−>yCx,y=0\sum_{x->y}C_{x,y}=0x>yCx,y=0
且对于每个环[v1,v2...vn](v1=vn)[v_1,v_2...v_n](v_1=v_n)[v1,v2...vn](v1=vn)
∑i=1n−1Cvi,vi+1×Bvi,vi+1=∑i=1n−1Avi,vi+1\sum_{i=1}^{n-1}C_{v_i,v_{i+1}}\times B_{v_i,v_{i+1}}=\sum_{i=1}^{n-1}A_{v_i,v_{i+1}}i=1n1Cvi,vi+1×Bvi,vi+1=i=1n1Avi,vi+1

现在给你A,BA,BA,B边权,求CCC边权。

数据保证解唯一,所有限制都在模PPP意义下

n∈[1,100],m∈[1,2000],P∈[1,1018]∪Prin\in[1,100],m\in[1,2000],P\in[1,10^{18}]\cup Prin[1,100],m[1,2000],P[1,1018]Pri


解题思路

最后一个环的限制很麻烦,因为环很多。

先考虑原图的任意一颗生成树TTT上,对于任意一条非树边(u,v)(u,v)(u,v)可以表示一个u−>v−>uu->v->uu>v>u的环。并且因为反过来走边权为负,所以你可以通过用一些小环相互抵消出一个大环。

结论就是所有的环都可以被一些用非树边表示的环相互抵消表示。所以我们就可以将环的数量减少到O(m)O(m)O(m)级别了。

暴力消元O(m3)O(m^3)O(m3)显然无法通过本题,我们还需要优化。

Dx,y=Bx,y×Cx,y−Ax,yD_{x,y}=B_{x,y}\times C_{x,y}-A_{x,y}Dx,y=Bx,y×Cx,yAx,y,那么第一个条件就表示成了每个环DDD的和为000

并且还能发现一个性质,对于一个非树边表示的环(x,y)(x,y)(x,y)
path(y,x)+Dx,y=0,path(x,y)=−path(y,x),⇒Dx,y=path(x,y)path(y,x)+D_{x,y}=0,path(x,y)=-path(y,x),\Rightarrow D_{x,y}=path(x,y)path(y,x)+Dx,y=0,path(x,y)=path(y,x),Dx,y=path(x,y)
(其中path(x,y)path(x,y)path(x,y)表示树上路径x,yx,yx,yDDD值和)

所以可以证明从xxx走到yyy的所有路径权值相同

那么我们可以设fx=path(1,x)f_x=path(1,x)fx=path(1,x),那么Dx,y=fy−fxD_{x,y}=f_y-f_xDx,y=fyfx

这样对于每个点就可以根据CCC的限制列出一个方程
∑x−>yfy−fx+Ax,yBx,y=0\sum_{x->y}\frac{f_y-f_x+A_{x,y}}{B_{x,y}}=0x>yBx,yfyfx+Ax,y=0

然后高斯消元即可,时间复杂度O(n3)O(n^3)O(n3)

注意模数比较大,要写龟速乘


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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.Net Core 2.1 通用主机(Core 在控制台应用程序中的应用)

一、介绍官方文档中说&#xff0c;Microsoft.AspNetCore.App 元包&#xff08;ASP.NET Core 2.1 或更高版本&#xff09;包含通用主机的Microsoft.Extensions.Hosting包&#xff0c;当创建控制台项目以后并没有相应的包。在官方案例中所用的Nuget包有&#xff1a;1. Microsoft.…

【二分】【最小生成树】公路修建问题(P2323)

正题 P2323 题目大意 给你n个点和若干边&#xff0c;每条边有两种代价&#xff0c;问你选择n-1条边使得这n个点连通&#xff0c;且选择第一种代价的边不小于k&#xff0c;让你使代价最大值最小 解题思路 二分答案&#xff0c;然后最小生成树&#xff0c;连接可以连得边&…

PAT 1152 Google Recruitment (20 分)- 甲级

题意 给出一个L长的字符串&#xff0c;求出其中第一个k位长的素数 题解&#xff1a; 其实就是暴力求解&#xff0c;不过在这介绍一个函数 int numstoi(s); s是string型的&#xff0c;stoi可以将string转换成int型 string f_str std::to_string(f); 是将int型转化成string型…

Grakn Forces 2020——D题Pecco模型总结

今天是双节但是为什么我今天好自闭啊啊啊&#xff0c;自己在寝室自闭了一下午&#xff0c;好无聊。明天一定要精神满满啊&#xff01; A - Circle Coloring 签到题 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iost…

产品开发管理之流程和体系(总篇)

前言秋风瑟瑟&#xff0c;夏日的灼热犹在&#xff0c;就瞬间迎来刺骨寒风。凛冬将至&#xff0c;今天对我们来说&#xff0c;像贴面的利刃一样冰冷而真实。农民、建筑工人、司机、程序员、私企高管、私企老板、资本巨富&#xff0c;都被裹挟进了这个焦灼的时代&#xff0c;没有…

YbtOJ#593-木棍问题【费用流】

正题 题目链接:https://www.ybtoj.com.cn/contest/114/problem/3 题目大意 n∗mn*mn∗m的网格上有一些格子有木球&#xff0c;两个相邻木球直接可以有木棍。 两个LLL形的木棍会产生AAA的代价&#xff0c;两个III形的木棍会产生BBB的代价 对于每个kkk求出插入kkk根木棍时的最小…

【LCT】旅游(P1505)

正题 P1505 题目大意 给你一棵树让你进行以下操作 1.修改一条边的权值 2.把一条链的权值取反 3.查询一条链的权值和 4.查询一条链的边权最大值 5.查询一条链的边权最小值 解题思路 把边拆成点&#xff0c;然后就是lct模板了 code #include<cstdio> #include<…

1143 Lowest Common Ancestor 甲级

题意&#xff1a; 给出一棵二叉搜索树的前序遍历&#xff0c;问结点u和v的共同最低祖先是谁&#xff0c;利用先序遍历特点。 二叉搜索树满足&#xff1a; 节点的左子树只包含键小于节点键的节点。 节点的键只包含节点的右键大于或等于子树的节点的键。 左子树和右子树也必须是…

牛客练习赛 70

A - 重新排列 二分答案&#xff0c;然后循环一边即可。 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; const int N100010; int cnt[30]; char s[N]; ch…

《.NET Core 2.0 应用程序高级调试》7折优惠

活动截止到2018年10月15日晚24:00&#xff0c;之后恢复8.6折价格。都说.NET Core 在Linux 上跑得快&#xff0c;可是如果.NET Core 程序在Linux 操作系统上出现了内存泄漏、死锁或者崩溃情况怎么办&#xff1f;怎样在Linux 和macOS操作系统上有效地使用工具对.NET Core 应用程序…

CF803G-Periodic RMQ Problem【离散化,线段树,ST表】

正题 题目链接:https://www.luogu.com.cn/problem/CF803G 题目大意 一个长度为nnn的序列aaa复制kkk份连接&#xff0c;要求支持 区间赋值区间查询最小值 n,q∈[1,105],k∈[1,104]n,q\in[1,10^5],k\in[1,10^4]n,q∈[1,105],k∈[1,104] 解题思路 先把所有查询的连续区间边界离…

【bfs】Replication G(P7151)

正题 P7151 题目大意 给你一个n*n的方阵&#xff0c;有若干机器人的起始点 机器人在每个时间会向一个方向走一步&#xff0c;经过D个时间后就会在相邻四个格子复制一个副本&#xff0c;副本会和原机器人走相同方向&#xff0c;同时也会复制 当任意一个机器人的操作碰到障碍…

1151 LCA in a Binary Tree 甲级

题意&#xff1a; 给定前序遍历和中序遍历&#xff0c;问u和v的lca &#xff08;先是中序&#xff0c;后是中序&#xff09; 题解&#xff1a; 方法一&#xff1a; 参考题解 将树映射到一颗BST上&#xff0c;在BST上找到答案然后再映射回原本的树 方法二&#xff1a; 参考题…

牛客练习赛 58——树链剖分

A - 牛能和宝石 签到题 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; const int N100010; int a[N],b[N]; int n; int main() {IO;int T1;//cin>>…

确认过眼神,你是ApacheWay的人 | COSCon‘18 特辑

*大会官网&#xff1a;http://coscon.kaiyuanshe.cn/*报名链接&#xff1a;点击文末“阅读原文”如果您对 Apache 感兴趣那么中国开源年会COSCon18将是您不可错过的一站写在大会前为什么本土开源项目对 Apache 青睐相加我们用实际数据说话Apache 顶级项目Apache CarbonData Car…

P6793-[SNOI2020]字符串【广义SAM,贪心】

正题 题目链接:https://www.luogu.com.cn/problem/P6793 题目大意 给出两个长度为nnn的字符串&#xff0c;取出他们所有长度为kkk的连续子串分别构成两个可重集合A,BA,BA,B。 你每次可以花费xxx点代价修改AAA中一个字符串长度为xxx的后缀&#xff0c;求至少花费多少代价能够…

【DP】Bovine Genetics G(P7152)

正题 P7152 题目大意 对于一个原串&#xff08;只有四种字符&#xff09;&#xff0c;先将所有相邻且相同的字符分割开&#xff0c;对分割得到的若干段翻转&#xff0c;得到编辑后的字符串&#xff0c;现在给出编辑后的字符串&#xff08;有一些位置不确定&#xff09;&#…

牛客练习赛 57——manacher算法 树形dp?

A - Tic-Tac-Toe 直接考虑每个人8种赢的情况即可。 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; const int N5; char g[N][N]; int main() {//IO;int …

1148 Werewolf - Simple Version 甲级

题意&#xff1a; 有n个玩家&#xff0c;有两个狼人&#xff0c;有两人说慌&#xff08;其中一个为狼人一个为非狼人&#xff09;&#xff0c;找出狼人是谁&#xff1f; 题解&#xff1a; 暴力枚举 先枚举i和j为狼人&#xff0c;然后从1号开始假设其说谎&#xff0c;然后判断…

asp.net core 错误定位 vs2017 远程调试部署在centos上的asp.net core程序

前言程序运行中会出现各种BUG。 排除BUG有三种方式。一、访问页面直接报错误信息出于安全&#xff0c;服务器是关闭这个功能的。在centos上可以用 命令设置环境变量来解决&#xff1a; export ASPNETCORE_ENVIRONMENTDevelopment二、console输出console.WriteLine(" hel…