problem

洛谷链接

注意:保证 C[v]C[v]C[v] 的奇偶性与顶点 vvv 的度的奇偶性相同。

solution

先考虑树的情况。这是个经典问题了,从叶子往上推,对于一个点还差的边权就有这个点和其父亲的边来补足。最后判断根是否满足条件即可。

那么怎么将树的解法扩展到普通图上面。

先随便找个这个图的生成树吧,单独考虑每一条非树边,会在生成树上形成一个环,非奇即偶。

假设非树边会产生 ±x±x±x 的影响。画图发现:

  • 如果形成的是偶环那么环上树边交替进行 ±x±x±x 的调整。

    xxx 在 lcalcalca 处就会抵消掉,继续往上相当于没产生任何贡献。

  • 如果形成的是奇环同样交替调整。

    xxx 在 lcalcalca 处会产生两倍的贡献,继续往上传递 ±2x±2x±2x。

这个 xxx 是由我们自行决定的,所以我们完全可以看根需要多少再定这条非树边的边权。

换言之,只要图中有奇环,那么一定有解。

因此,对于会形成偶环的非树边直接边权等于零,会形成奇环的非树边只需要一条边权为 根需要边权除以二,其余同样边权为零。

暴力更替那个奇环上的边权答案即可。

code

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define maxn 100005
vector < pair < int, int > > G[maxn];
int n, m, s, t, ID;
bool vis[maxn], color[maxn];
int c[maxn], w[maxn], dep[maxn], ans[maxn], fa[maxn], fa_id[maxn];void dfs1( int u ) {vis[u] = 1;for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i].first, id = G[u][i].second;if( ! vis[v] ) {fa[v] = u;fa_id[v] = id;dep[v] = dep[u] + 1;color[v] = color[u] ^ 1;dfs1( v );ans[id] = w[v];//由儿子推父亲 当与所有儿子v-son边权确定时v剩下的就只能通过和父亲u的连边弥补w[u] -= w[v];}else if( dep[v] < dep[u] and color[u] == color[v] ) s = u, t = v, ID = id; //返祖边找到奇环}
}void dfs2( int u ) {vis[u] = 1;for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i].first, id = G[u][i].second;if( id ^ ID and ! vis[v] ) {dfs2( v );ans[id] = c[v];c[u] -= c[v];}}
}signed main() {scanf( "%lld %lld", &n, &m );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &c[i] ), w[i] = c[i];for( int i = 1, u, v;i <= m;i ++ ) {scanf( "%lld %lld", &u, &v );G[u].push_back( make_pair( v, i ) );G[v].push_back( make_pair( u, i ) );}dfs1( 1 );if( ! w[1] ) {printf( "YES\n" );for( int i = 1;i <= m;i ++ ) printf( "%lld\n", ans[i] );}else if( s ) {memset( vis, 0, sizeof( vis ) );memset( ans, 0, sizeof( ans ) );dfs2( s ); int x = c[s] >> 1, op = 1;while( s ^ t ) {ans[fa_id[s]] += op * x;op *= -1;s = fa[s];}ans[ID] += op * x;printf( "YES\n" );for( int i = 1;i <= m;i ++ ) printf( "%lld\n", ans[i] );}else printf( "NO\n" );return 0;
}

CodeForces 901D Weighting a Tree(结论)相关推荐

  1. Codeforces Round #453 (Div. 1) D. Weighting a Tree 构造 + dfs树

    传送门 文章目录 题意: 思路: 题意: 给你一颗nnn个点的图,每个点都有一个点权cic_ici​,要求你给每个边赋一个权值kik_iki​,要求对于每个点与他相连的边的权值之和等于这个点的点权ci ...

  2. Educational Codeforces Round 25 G. Tree Queries

    题目链接:Educational Codeforces Round 25 G. Tree Queries 题意: 给你一棵树,一开始所有的点全是黑色,有两种操作. 1 x 将x这个点变为黑色,保证第一 ...

  3. Codeforces 1129 E.Legendary Tree

    Codeforces 1129 E.Legendary Tree 解题思路: 这题好厉害,我来复读一下官方题解,顺便补充几句. 首先,可以通过询问 \(n-1​\) 次 \((S=\{1\},T=\{ ...

  4. Codeforces #1248B Grow The Tree题解(Java)

    Codeforces #1248B Grow The Tree题解(Java) 题目大意: 输入: 输出: 数据范围: 思路 代码 题目链接 题目大意: 给出一组线段(题目中叫树枝)的长度,制作成一条 ...

  5. Codeforces 463E Caisa and Tree

    Caisa and Tree 在dfs的过程中枚举质因子瞎搞搞就好啦, 不过这个题意真的表述不清.. #include<bits/stdc++.h> #define LL long lon ...

  6. CodeForces - 609E Minimum spanning tree for each edge(最小生成树+树链剖分+线段树/树上倍增)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的无向图,现在询问包含每一条边的最小生成树 题目分析:考虑求解次小生成树的思路: 求出最小生成树 ans 枚举每一条非树边 ( u , ...

  7. CodeForces - 620E New Year Tree(线段树+dfs序+状态压缩)

    题目链接:点击查看 题目大意:给出一棵无向树,每个节点都有一种颜色,接下来时m次操作: 1 x y:将x及其子树染成y的颜色 2 x:查询x及其子树上共有多少种不同的颜色 题目分析:看完这个题的第一反 ...

  8. codeforces E. Jamie and Tree LCA+dfs序+线段树

    题解: 写起来还稍微有点麻烦. dfs序+线段树可以维护子树的整体修改和查询. 因此,这道题我们要往子树上靠. 我们首先从1号点进行dfs遍历,顺便求出点的dfs序和深度,然后我们采用倍增的思想,可以 ...

  9. Codeforces 699D Fix a Tree 并查集

    原题:http://codeforces.com/contest/699/problem/D 题目中所描述的从属关系,可以看作是一个一个块,可以用并查集来维护这个森林.这些从属关系中会有两种环,第一种 ...

最新文章

  1. 昨天登陆页面,无法进入后台,今天攻克了
  2. python编程-迭代器(类,方法,继承),函数,数据结构,
  3. The Everyman's Guide to How Network Packets Are Routed Across the Web
  4. 简述 C语言 有和 C++ 的基本区别,你真的懂吗?(新手面试必学)
  5. 纯js实现瀑布流布局及ajax动态新增数据
  6. disruptor模拟高速处理大规模订单类业务场景
  7. kill apache
  8. Elasticsearch增删改查 之 —— mget多文档查询
  9. java读取图片画布大小_在html5中,为什么最好不要用css去修改画布的大小?
  10. windows10如何卸载edge浏览器 1809版本
  11. java微信订阅号(公众号)开发案例
  12. 蓝桥杯单片机温度传感器DS18B20(基于STC15F2K60S2)
  13. Ubuntu下载软件包网速过慢的解决方法
  14. 整型数组——首尾相连
  15. 大数据和数据中心的对比分析
  16. 使用 IDEA 翻译插件
  17. SQL语句查询拼音码
  18. css语法---选择器
  19. 第一章 认识Java 2019-09-28
  20. Block Memory Generator之TDPRAM应用知识点记录

热门文章

  1. 每日一笑 | 男朋友整天沉迷游戏怎么办...?
  2. linux ntfs 速度慢,将U盘磁盘格式改成NTFS解决u盘复制速度慢问题
  3. 代理管家app_亲亲小保社保管家app2021下载_亲亲小保社保管家app最新版下载
  4. 四川中级职称计算机考试考b级,四川省职称计算机B级考试1卷
  5. 7-51 两个有序链表序列的合并 (20 分)(vector做法)
  6. c++将字符串转换成 int 类型
  7. pip 设置超时时间_Python pip使用超时问题解决方案
  8. AcWing 523. 组合数问题
  9. C++this指针的用途
  10. Sorting It All Out (易错题+拓扑排序+有向图(判环+判有序)优先级)