267C
二分+高斯消元
我们利用物理里的势能来表示,每个点有一个势能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的更多相关文章
- 在网站中嵌入VideoJs视频播放器
一个博客难免需要引用视频来说明内容,但想要自己来实现一个视频播放器是不是一时半会就能完成的,更重要的是这需要对视频播放技术有一定的了解.于是自然而然的有人会想到开源项目.一个不错的选择便是video. ...
随机推荐
- Java中IO对象的输入输出流
输入流: public void inputDemo () throws IOException { //文件名称 String fileName = "d:\\aaa.txt"; ...
- BZOJ 2276: [Poi2011]Temperature 单调队列
Code: #include<bits/stdc++.h> #define maxn 3000000 using namespace std; void setIO(string s) { ...
- ES6学习历程(变量的解构赋值)
一.数组的解构赋值 1.举几个例子足以理解 let [a, b, c] = [1, 2, 3]; a:1; b:2; c:3; let [x, , y] = [1, 2, 3]; x:1 y ...
- (C/C++学习)9.C/C++优化排序
说明:在C/C++中常见的排序方法有两种,第一种为选择排序法,第二种为冒泡排序法,本文将对这两种排序法进行优化,并给出一种更为快捷的排序法. 一.未优化的排序法 现在假如要对一个数组进行排序,假设这个 ...
- 到Oracle官网下载 Oracle11 G 数据可和客户端操作
1.准备一个Oracle的官网账号 用户名:541509124@qq.com 密码:LR4ever.1314 2.在搜索框中输入Oracle 11 G 3.点击Database Downloadds ...
- 渗透实战(周六):Hydra&Metasploit暴力破解SSH登录口令
一. SSH服务开启前基础配置 1.1 修改配置文件
- PAT 1102 Invert a Binary Tree
The following is from Max Howell @twitter: Google: 90% of our engineers use the software you wrote ( ...
- 一个电商项目的Web服务化改造2:现有项目的5个问题
最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA. 有点挑战,做完了,会有很大进步, 1.现有项目的问题 1.1代码风格不统一 不同的 ...
- IDEA 工具使用报错总结
读前语:此文章仅给非入门级观看 1.使用Debug 无法运行,而使用Run 则正常启动,报错代码如下 1 Error running 'jx_web': Unable to open debugge ...
- noip模拟赛 拼不出的数
分析:如果每个数可以选任意多次,那么就是一个很普通的dp问题,这里每个数只能选一次,还是考虑dp,设f(i)表示1~i是否都能选上.考虑下一个数j,如果j > i + 1,那么i+1这个数就选不 ...