二分+高斯消元

我们利用物理里的势能来表示,每个点有一个势能h,再由流量守恒可以得到deg[x]*h[x]=sigma(h[y]) 如果x,y之间有边。这个式子是由流量守恒推出的,所以当x=1或n是不满足这个方程的。

每次二分n的势能,然后把1和n赋值,高斯消元,检验答案。

势能保证了到达一个点所有路径长度相同,也保证了流量守恒。

各种小错误 调了两个小时

#include<bits/stdc++.h>
using namespace std;
const int N = ;
struct edge {
int a, b;
double c;
} e[N * ];
int n, m;
double ans;
double a[N][N];
void gauss()
{
for(int i = ; i <= n; ++i)
{
int now = i, pos = i;
while(now <= n)
{
if(fabs(a[now][i]) > fabs(a[pos][i]))
pos = now;
++now;
}
for(int j = ; j <= n + ; ++j)
swap(a[i][j], a[pos][j]);
if(fabs(a[i][i]) < 1e-) continue;
double x = a[i][i];
for(int j = ; j <= n + ; ++j)
a[i][j] /= x;
for(int j = ; j <= n; ++j) if(j != i && fabs(a[j][i]) > 1e-)
{
double x = a[j][i] / a[i][i];
for(int k = ; k <= n + ; ++k)
a[j][k] -= x * a[i][k];
}
}
}
bool C(double x)
{
for(int i = ; i <= n; ++i)
for(int j = ; j <= n + ; ++j)
a[i][j] = 0.0;
for(int i = ; i <= m; ++i)
{
if(e[i].b != && e[i].b != n)
{
a[e[i].b][e[i].b] += 1.0;
a[e[i].b][e[i].a] -= 1.0;
}
if(e[i].a != && e[i].a != n)
{
a[e[i].a][e[i].a] += 1.0;
a[e[i].a][e[i].b] -= 1.0;
}
}
a[][] = 1.0;
a[n][n] = 1.0;
a[n][n + ] = x;
gauss();
for(int i = ; i <= m; ++i)
{
if(fabs(a[e[i].b][n + ] - a[e[i].a][n + ]) > e[i].c) return false;
}
return true;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = ; i <= m; ++i)
{
scanf("%d%d%lf", &e[i].a, &e[i].b, &e[i].c);
}
double l = , r = 1e9 + ;
while(r - l > 1e-)
{
double mid = (l + r) / 2.0;
if(C(mid)) l = ans = mid;
else r = mid;
}
C(ans);
ans = ;
for(int i = ; i <= m; ++i)
{
if(e[i].b == n || e[i].a == n) ans += fabs(a[e[i].b][n + ] - a[e[i].a][n + ]);
}
printf("%.6f\n", ans);
for(int i = ; i <= m; ++i)
printf("%.6f\n", a[e[i].b][n + ] - a[e[i].a][n + ]);
return ;
}

267C的更多相关文章

  1. 在网站中嵌入VideoJs视频播放器

    一个博客难免需要引用视频来说明内容,但想要自己来实现一个视频播放器是不是一时半会就能完成的,更重要的是这需要对视频播放技术有一定的了解.于是自然而然的有人会想到开源项目.一个不错的选择便是video. ...

随机推荐

  1. JS——大小写转化

    <script> var str = 'JavaScript'; console.log(str.toUpperCase());//小写转大写 console.log(str.toLowe ...

  2. mysql有关时间是问题

     mysql中有关时间的类型 date/datetime/time/timestamp/year date:表示日期的类型,格式为:“yyyy-MM-dd” dateTime:表示日期时间的类型,格式 ...

  3. day13-迭代器、三元表达式、列表推导式、字典生成式、生成器与递归

    目录 迭代器 可迭代对象 迭代器对象 for循环原理 三元表达式(三目表达式) 列表推导式 字典生成式 zip()方法 生成器 生成器表达式 递归 递归的两个阶段 迭代器 迭代器即迭代的工具,迭代是一 ...

  4. jq购物车结算功能

    css *{font-style: normal} .gw{margin: 8px;} .gw::after{display: block;clear: both;content: '';margin ...

  5. vue移动端地址三级联动组件(一)

    vue移动端地区三级联动 省,市,县.用的vue+mintUi 因为多级联动以及地区的规则比较多.正好有时间自己写了一个.有问题以及建议欢迎指出.涉及到dom移动,所以依赖vue+jquery.这边数 ...

  6. enote笔记语言(5)——其他

    章节:其他   ((主:单词))                               用来醒目地强调这个句子中哪个词语作主语 sentence:                         ...

  7. C#学习笔记_14_接口&命名空间

    14_接口&命名空间 接口 一系列规范 语法: 如果一个类的后面既有父类也有接口,那么一定是父类在前,接口靠后 一个类可以实现多个接口 规范:接口命名以大写字母 I 开头 接口中可以包含接口方 ...

  8. 2019字节跳动冬令营day7娱乐赛19题题解

    啊没去听讲题,也没发纸质题解,电子版题解也没有 为最后几个unsolve自闭了一段时间才全都A掉 3个队友写的我没看的题通过人数蛮多就不管了 题目地址:https://pan.baidu.com/s/ ...

  9. bupt summer training for 16 #6 ——图论

    https://vjudge.net/contest/174020 A.100条双向边,每个点最少连2个边 所以最多100个点,点的标号需要离散化 然后要求恰好经过n条路径 快速幂,乘法过程就是flo ...

  10. Office 2003的卸载 与 Office 2013 的安装

    一.Office 2003的卸载 软件:卸载Office2003.msi 运行该软件,等待几分钟即可, 二.Office 2013 的安装 1.Office Professional Plus 201 ...