二分+高斯消元

我们利用物理里的势能来表示,每个点有一个势能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. windows 设置注册表服务自动启动

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\xxx\Start = ,=自动,,=禁用

  2. 结果缓冲区 resbuf具体用法

    struct resbuf *rb; rb=acutBulidlist(RTSTR,text(), rtpoint,,,,,) 创建圆用法. acdbEntGet 返回结果缓冲区  然后 rb-> ...

  3. CAD创建一个新的图形文件

    static void linea(void) { AcDbDatabase *pDb = new AcDbDatabase(true, false); AcGePoint3d pickPoint; ...

  4. IntelliJ IDEA之windows下载安装、卸载

    系统要求 系统支持:Microsoft Windows 8 / 7 / Vista / 2003 / XP(每个系统版本的 32 位和 64 位都可以) JDK 版本:Oracle JDK 1.6 或 ...

  5. C语言中的DEBUG

    #cat aa.c #include <stdio.h> #include <stdarg.h> #include <stdlib.h> #include < ...

  6. webpack打包出错,通过babel将es6转es5的出错。

    错误信息如下: 解决方法: 1,先安装babel-preset-es2015到项目中, cnpm install babel-preset-es2015 --save-dev2,在项目根目录中新建一个 ...

  7. Gym - 101611D Decoding of Varints(阅读理解题 )

    Decoding of Varints ​ 题意&思路: 首先根据红色边框部分的公式算出x,再有绿色部分得知,如果x是偶数则直接除以2,x是奇数则(x+1)/-2. PS:这题有数据会爆掉un ...

  8. python文件头的含义

    一.指定解释器及其路径 在Linux\Mac上,可以用./文件路径直接运行.py文件 这时,需要在python文件开头指定解释器及其路径 #!/usr/bin/python 这样系统就直接按pytho ...

  9. maven是干什么的?

    最近在研究后台相关的东西,虽然前端还不是很了解吧~但是计算机一年没写后台代码,我快废掉了呀~emmmmm....他们老是和我说maven,恩恩,那就看看到底是啥?从大神聚集的知乎上拉了一篇过来~存档: ...

  10. 【codeforces 510D】Fox And Jumping

    [题目链接]:http://codeforces.com/contest/510/problem/D [题意] 你可以买n种卡片; 每种卡片的花费对应c[i]; 当你拥有了第i种卡片之后; 你可以在任 ...