题意:

  n个点m条边的无向图,有些点有权值,有些没有。边权都为正。给剩下的点标上数字,使得$\sum\limits_{(u,v)\in E}len(u,v) \times (w[u] - w[v]) ^ 2$最小。

分析:

  $$\begin{aligned}\sum_{x\to v}(w_v-w_x)^2\cdot len_v&=\sum_{x\to v}(w_v^2-2w_vw_x+w_x^2)\cdot len_v\\&=\left(\sum len_v\right)w_x^2+\left(\sum-2len_vw_v\right)w_x+\sum len_vw_v^2\end{aligned}$$

  这是一个二次函数,可以知道取最小值的时候:$$w_x=\frac{\sum w_vlen_v}{\sum len_v}$$

  根据这个可以列出很多个方程,然后高斯消元即可。将已确定的值放到右边,未确定的放到左边。

  只与为什么一定有解,可以感性的理解一下,或者戳这

代码:

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
#include<bitset>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
const double eps = 1e-;
struct Edge { int to, nxt, w; } e[];
double A[N][N], w[N];
int a[N], b[N], c[N], head[N], En;
bool B[N]; inline void add_edge(int u,int v,int w) {
++En; e[En].to = v, e[En].w = w, e[En].nxt = head[u]; head[u] = En;
++En; e[En].to = u, e[En].w = w, e[En].nxt = head[v]; head[v] = En;
}
inline double sqr(double x) { return x * x; }
void Gauss(int n) {
for (int k = ; k <= n; ++k) {
if (!B[k]) k ++;
int r = k;
for (int i = k + ; i <= n; ++i) if (fabs(A[i][k]) > fabs(A[r][k])) r = k;
if (r != k) for (int j = ; j <= n + ; ++j) swap(A[k][j], A[r][j]);
if (fabs(A[k][k]) < eps) continue;
for (int i = k + ; i <= n; ++i) {
if (fabs(A[i][k]) > eps) {
double t = A[i][k] / A[k][k];
for (int j = ; j <= n + ; ++j) A[i][j] -= t * A[k][j];
}
}
}
for (int i = n; i; --i) {
if (!B[i]) continue;
for (int j = i + ; j <= n + ; ++j) A[i][n + ] -= A[i][j] * w[j];
w[i] = A[i][n + ] / A[i][i];
}
}
int main() {
int n = read(), m = read();
for (int i = ; i <= m; ++i) {
int u = read(), v = read(), w = read();
if (u != v) add_edge(u, v, w);
}
for (int i = ; i <= n; ++i) w[i] = read();
for (int i = ; i <= n; ++i) {
if (w[i] < ) {
B[i] = ;
for (int j = head[i]; j; j = e[j].nxt) {
int v = e[j].to;
if (w[v] < ) A[i][v] -= e[j].w;
else A[i][n + ] += 1.0 * w[v] * e[j].w;
A[i][i] += e[j].w;
}
}
}
Gauss(n);
double ans = ;
for (int i = ; i <= n; ++i)
for (int j = head[i]; j; j = e[j].nxt)
if (e[j].to > i) ans += sqr(w[i] - w[e[j].to]) * e[j].w;
printf("%.10lf\n", ans);
return ;
}

校内模拟赛 Label的更多相关文章

  1. 【20170521校内模拟赛】热爱生活的小Z

    学长FallDream所出的模拟赛,个人感觉题目难度还是比较适中的,难度在提高+左右,可能比较接近弱省省选,总体来讲试题考查范围较广,个人认为还是很不错的. 所有试题如无特殊声明,开启-O2优化,时限 ...

  2. Java实现蓝桥杯第十一届校内模拟赛

    有不对的地方欢迎大佬们进行评论(ง •_•)ง 多交流才能进步,互相学习,互相进步 蓝桥杯交流群:99979568 欢迎加入 o( ̄▽ ̄)ブ 有一道题我没写,感觉没有必要写上去就是给你多少MB然后求计 ...

  3. 【20170920校内模拟赛】小Z爱学习

    所有题目开启-O2优化,开大栈空间,评测机效率为4亿左右. T1 小 Z 学数学(math) Description ​ 要说小 Z 最不擅长的学科,那一定就是数学了.这不,他最近正在学习加法运算.老 ...

  4. 校内模拟赛 Zbq's Music Challenge

    Zbq's Music Challenge 题意: 一个长度为n的序列,每个位置可能是1或者0,1的概率是$p_i$.对于一个序列$S$,它的得分是 $$BasicScore=A\times \sum ...

  5. 校内模拟赛 Attack's Fond Of LeTri

    Attack's Fond Of LeTri 题意: n个房子m条路径边的无向图,每个房子可以最终容纳b个人,初始有a个人,中途超过可以超过b个人,每条边有一个长度,经过一条边的时间花费为边的长度.求 ...

  6. 校内模拟赛 SovietPower Play With Amstar

    SovietPower Play With Amstar 题意: 一棵二叉树,每次询问一条路径上的路径和,初始每个点有一个权值1,询问后权值变为0.$n \leq 10^7,m\leq10^6$ 分析 ...

  7. 校内模拟赛 虫洞(by NiroBC)

    题意: n个点m条边的有向图,每一天每条边存在的概率都是p,在最优策略下,询问从1到n的期望天数. 分析: dijkstra. 每次一定会优先选dp最小的后继走,如果这条边不存在,选次小的,以此类推. ...

  8. 校内模拟赛 旅行(by NiroBC)

    题意: n个点的无向图,Q次操作,每次操作可以连接增加一条边,询问两个点之间有多少条边是必经之路.如果不连通,输出-1. 分析: 首先并查集维护连通性,每次加入一条边后,如果这条边将会连接两个联通块, ...

  9. 校内模拟赛 coin

    题意: n*m的棋盘,每个格子可能是反着的硬币,正着的硬币,没有硬币,每次可以选未选择的一行或者未选择的一列,将这一行/列的硬币取反.如果没有可选的或者硬币已经全部正面,那么游戏结束. 最后一次操作的 ...

随机推荐

  1. Fiddler抓包使用教程-扫盲篇

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72823370 本文出自[赵彦军的博客] 1.什么是抓包? 不同主机之间的数据通信都 ...

  2. Git创建本地仓库并推送至远程仓库

    作为一名测试同学,日常工作经常需要checkout研发代码进行code review.自己极少有机会创建仓库,一度以为这是一个非常复杂过程.操作一遍后,发现也不过六个步骤,so,让我们一起揭开这神秘面 ...

  3. css继承属性与非继承属性

    一.无继承性的属性 1.display:规定元素应该生成的框的类型 2.文本属性: vertical-align:垂直文本对齐 text-decoration:规定添加到文本的装饰 text-shad ...

  4. git命令:全局设置用户名邮箱配置

    1.查看git配置信息 git config --list 2.查看git用户名 git config user.name 3.查看邮箱配置 git config user.email 4.全局配置用 ...

  5. 通过javascript添加一行

    <html><head> <title>添加新的行</title></head><body> <div onclick=& ...

  6. 乘风破浪:LeetCode真题_030_Substring with Concatenation of All Words

    乘风破浪:LeetCode真题_030_Substring with Concatenation of All Words 一.前言    这次我们还是找字符串的索引,不过,需要将另一个字符串列表中的 ...

  7. 粗略的整改一下blog

    一.先找个简约的模板:看个人喜好咯 二.页面定制CSS: 1.首先,查看主页源码,了解一下各个标签的id,引用的class等 2.通过操作相应的id,class,和标签,进行个性化.这里需要具备看懂和 ...

  8. mnist手写数字检测

    # -*- coding: utf-8 -*- """ Created on Tue Apr 23 06:16:04 2019 @author: 92958 " ...

  9. .Net使用163smtp发送邮件时错误:邮箱不可用. has no permission解决方法

    C#实现简单邮件发送代码如下 public static void SendAsync(string emailTo, string subject, string mailBody) { var m ...

  10. myeclipse10无法weblogic10.3的问题解决方案

    在完成了myec与wl10的基本配置后,启动报如下错误 Parsing Failure in config.xml: java.lang.AssertionError: java.lang.Class ...