正题

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


题目大意

给出一张\(n\)个点\(m\)条边的无向联通图,每条边正反向各有\(A,B,C\)三种边权。

保证满足

\[A_{x,y}=-A_{y,x}\ ,\ B_{x,y}=B_{y,x}\ ,\ C_{x,y}=-C_{y,x}
\]
\[\sum_{x->y}C_{x,y}=0
\]

且对于每个环\([v_1,v_2...v_n](v_1=v_n)\)

\[\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}}
\]

现在给你\(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(y,x)+D_{x,y}=0,path(x,y)=-path(y,x),\Rightarrow D_{x,y}=path(x,y)
\]

(其中\(path(x,y)\)表示树上路径\(x,y\)的\(D\)值和)

所以可以证明从\(x\)走到\(y\)的所有路径权值相同

那么我们可以设\(f_x=path(1,x)\),那么\(D_{x,y}=f_y-f_x\)。

这样对于每个点就可以根据\(C\)的限制列出一个方程

\[\sum_{x->y}\frac{f_y-f_x+A_{x,y}}{B_{x,y}}=0
\]

然后高斯消元即可,时间复杂度\(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-带权的图【高斯消元,结论】的更多相关文章

  1. 4.23 子串 AC自动机 概率期望 高斯消元

    考虑40分. 设出状态 f[i]表示匹配到了i位还有多少期望长度能停止.可以发现这个状态有环 需要高斯消元. 提供一种比较简单的方法:由于期望的线性可加性 可以设状态f[i]表示由匹配到i到匹配到i+ ...

  2. POJ 2947-Widget Factory(高斯消元解同余方程式)

    题目地址:id=2947">POJ 2947 题意:N种物品.M条记录,接写来M行,每行有K.Start,End,表述从星期Start到星期End,做了K件物品.接下来的K个数为物品的 ...

  3. [CF963E]Circles of Waiting[高斯消元网格图优化+期望]

    题意 你初始位于 \((0,0)\) ,每次向上下左右四个方向走一步有确定的概率,问你什么时候可以走到 以 \((0,0)\)为圆心,\(R\) 为半径的圆外. \(R\le 50\) 分析 暴力 \ ...

  4. 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 ...

  5. BZOJ 3143 HNOI2013 游走 高斯消元 期望

    这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 不过笔者在做完后发现了一些问题,在原文的后面进行了说明. 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号 ...

  6. bzoj 2115: [Wc2011] Xor xor高斯消元

    2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 797  Solved: 375[Submit][Status] ...

  7. 线性空间和异或空间(线性基)bzoj4004贪心+高斯消元优秀模板

    线性空间:是由一组基底构成的所有可以组成的向量空间 对于一个n*m的矩阵,高斯消元后的i个主元可以构成i维的线性空间,i就是矩阵的秩 并且这i个主元线性无关 /* 每个向量有权值,求最小权极大线性无关 ...

  8. BZOJ 3143 游走(贪心+期望+高斯消元)

    一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分 ...

  9. 【BZOJ】2337: [HNOI2011]XOR和路径 期望+高斯消元

    [题意]给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值.n<=100,wi<=10^9. [算法]期望+高斯消元 [题解]首先异或不 ...

随机推荐

  1. 自定义Vue&Element组件,实现用户选择和显示

    在我们很多前端业务开发中,往往为了方便,都需要自定义一些用户组件,一个是减少单一页面的代码,提高维护效率:二个也是方便重用.本篇随笔介绍在任务管理操作中,使用自定义Vue&Element组件, ...

  2. 【开发工具】idea常用配置

    1. 设置鼠标滚轮修改字体大小 我们可以勾选此设置后,增加Ctrl + 鼠标滚轮 快捷键来控制代码字体大小显示. 2. 设置鼠标悬浮提示  3. 设置自动导包功能 Add unambiguous im ...

  3. Object 类中的主要结构

    == 操作符与equals 方法 == 操作符  equals 方法  重写equals() 方法的 toString()  方法

  4. Qt foreach关键字用法(无师自通)

    Qt 提供一个关键字 foreach (实际是 <QtGlobal> 里定义的一个宏)用于方便地访问容器里所有数据项. foreach 关键字用于遍历容路中所有的项,使用 foreach ...

  5. uwp 之吐司 toast

    Toast -------------------------------------------------------------- var t = Windows.UI.Notification ...

  6. C#设计模式---迭代器模式(Iterator Pattern)

    一.目的 提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节. 二.定义 迭代器模式提供了一种方法访问一个聚合对象(理解为集合对象)中各个元素,而又无需暴露该对象的内部表示,这样既可 ...

  7. 【nodejs】express框架+mysql后台数据查询

    一 环境部署 1,首先安装nodejs,并配置好环境变量(看自己习惯), 2,安装Express npm install express -g //全局安装 npm install express-g ...

  8. (2)hadoop之-----配置免密码登录

    ssh-keygen -t rsa 然后一路回车 在家目录下会生成 .ssh 目录           ls -la   查看 进入   .ssh            cd .ssh cp ~/.s ...

  9. hdu1002 大数相加问题

    这个题对于 几个月前的我简直是噩梦  好在磕磕绊绊终于写出来了 由于自己的问题  还被巨巨嘲讽了 1 1.#include<stdio.h> 2 2.#include<string. ...

  10. css - 样式 - 可见性

    visibility 可见性 取值:visible(可见) |  hidden(隐藏.保留占位) 设置给:块.行内块.行内元素 作用:设置元素在文档上的可见性 此属性只是隐藏元素,但会为元素保留占位. ...