原文链接https://www.cnblogs.com/zhouzhendong/p/AtCoder-SoundHound-Inc-Programming-Contest-2018-E.html

题目传送门 - AtCoder SoundHound Inc. Programming Contest 2018 E

题意

  给定一个无向连通图,有 $n$ 个节点 $m$ 条带权边,第 $i$ 条边连接 $x_i,y_i$ ,权值为 $s_i$ ,没有重边、自环。

  现在,请你给每一个节点取一个正整数点权。问有多少种方案使得任意一条边两端的节点权值和等于边权。

  $2\leq n\leq 100000,1\leq m\leq 100000$

  所有输入的数字都在 $10^9$ 以内。

题解

  先吐槽:

    这题细节好坑啊!!!我当场做到只 WA 一个点,没想到 20 分钟还是没有发现特判,然后 GG 。然后考完发现在我没注意的地方忘记特判了??然后考完不到10分钟把它过了。就加了几行。

  然后讲做法。

  设 $v_i$ 为第 $i$ 个点的点权。

  首先,我们考虑到对于所有的 $i$ ,有 $v_{x_i}+v_{y_i}=s_i$ 。我们把式子移动一下,得到:

$$v_{x_i}-s_i=(-v_{y_i})$$

$$(-v_{y_i})+s_i=v_{x_i}$$

$$v_{y_i}-s_i=(-v_{x_i})$$

$$(-v_{x_i})+s_i=v_{y_i}$$

  我们使节点 $1$ 作为初始节点,即令 $v_1=\alpha$ 。

  我们考虑将每一个点拆成两个点,一个点记录其正的权值(即 $v_i=\alpha + k$ 时,记录的值为 $k$ ),另一个点记录其负权值(即 $-v_i=\alpha+k$ ,记录的值为 $k$)。

  然后我们对于每一条边,拆成上述四条有向边。

  然后 bfs 一遍把每一个点与 $\alpha$ 的关系求出来。这里注意一点,如果到达一个点有两条距离不同的路径,那么显然答案为 $0$ 。(条件冲突)

  然后我们得到了一些数据。

  我们考虑去解决那些拆点之后两个节点都被访问的节点。

  对于每一个这样的节点,我们可以解出唯一的 $\alpha$ ,如果所有节点的解有不同,那么答案显然是 $0$ 。否则答案显然是 $1$ 。

  请您先思索一下在选中下面黑色矩形区域内的字看下面的话。

  这样是错的!!我就是挂在这里了。我们不能这么着急的确定答案是 $1$ 。因为我们还需要满足所有点权均为正整数。所以我们还需要判一判。

  然后就只剩下二分图的情况了。

  对于这种情况,我们只需要根据每一个节点与初始节点 $1$ 的关系,根据“正整数”这个条件更新 $\alpha$ 的取值范围。最后输出即可。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=400005;
struct Gragh{int cnt,y[N],z[N],nxt[N],fst[N];void clear(){cnt=0;memset(fst,0,sizeof fst);}void add(int a,int b,int c){y[++cnt]=b,z[cnt]=c,nxt[cnt]=fst[a],fst[a]=cnt;}
}g;
int n,m;
int q[N],head,tail;
LL dis[N];
LL INF=10000000000000000LL;
void out0(){puts("0");exit(0);
}
void SPFA(int S){for (int i=1;i<=n*2;i++)dis[i]=INF;head=tail=0;q[++tail]=S;dis[S]=0;while (head!=tail){int x=q[++head],y;for (int i=g.fst[x];i;i=g.nxt[i]){int y=g.y[i];if (dis[y]!=dis[x]+g.z[i]){if (dis[y]!=INF)out0();dis[y]=dis[x]+g.z[i];q[++tail]=y;}}}
}
int main(){scanf("%d%d",&n,&m);g.clear();for (int i=1;i<=m;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);g.add(a,b+n,-c);g.add(b+n,a,c);g.add(b,a+n,-c);g.add(a+n,b,c);}SPFA(1);LL v=INF;for (int i=1;i<=n;i++)if (dis[i]!=INF&&dis[i+n]!=INF){LL A=dis[i],B=dis[i+n];if ((A+B)%2LL)out0();LL x=-(A+B)/2LL;if (x!=v)if (v==INF)v=x;elseout0();}if (v!=INF){int f=1;for (int i=1;i<=n;i++){if (dis[i]!=INF)if (v+dis[i]<=0)f=0;if (dis[i+n]!=INF)if (v+dis[i+n]>=0)f=0;}printf("%d",f);return 0;}LL MIN=1,MAX=INF;for (int i=1;i<=n;i++)if (dis[i]!=INF)MIN=max(MIN,-dis[i]+1);elseMAX=min(MAX,-dis[i+n]-1);printf("%lld",max(MAX-MIN+1,0LL));return 0;
}

  

转载于:https://www.cnblogs.com/zhouzhendong/p/AtCoder-SoundHound-Inc-Programming-Contest-2018-E.html

AtCoder SoundHound Inc. Programming Contest 2018 E + Graph (soundhound2018_summer_qual_e)相关推荐

  1. SoundHound Inc. Programming Contest 2018[C. Ordinary Beauty]

    SoundHound Inc. Programming Contest 2018 -Masters Tournament-[C. Ordinary Beauty] 打表找规律的. \(n = 1\) ...

  2. Sichuan University Programming Contest 2018 Preliminary

    嗯为了防止大家AK,所以这次的A题和K题我们就当做不存在好了! 经历了昨天写了两个多小时的博客没保存的心态炸裂,今天终于下了个Markdown.所以我猜这篇的格式应该会更好看一点! 好吧废话不多说 题 ...

  3. AtCoder ZONe Energy Programming Contest 题解

    文章目录 A - UFO Invasion B - Sign of Friendship C - MAD TEAM D - Message from Aliens E - Sneaking F - E ...

  4. [Atcoder SoundHound Contest 2018]E.+ Graph

    题面 Time limit : 2sec / Memory limit : 1024MB Score : 600 points Problem Statement-题目描述 Kenkoooo foun ...

  5. Atcoder TOYOTA SYSTEMS Programming Contest 2021(AtCoder Beginner Contest 228) B - Takahashi‘s Secret

    题目链接:B - Takahashi's Secret (atcoder.jp) Problem Statement Takahashi has N friends. They have nickna ...

  6. Atcoder TOYOTA SYSTEMS Programming Contest 2021(AtCoder Beginner Contest 228) C - Final Day

    题目链接:C - Final Day (atcoder.jp) Problem Statement N students are taking a 4-day exam. There is a 300 ...

  7. Gym - 101972B Arabella Collegiate Programming Contest (2018) B. Updating the Tree 树DFS

    题面 题意:T组数据,每次给你1e5个点的树(1为根),每个点有一权值,询问1-n每个节点的子树中, 至少修改几个点的权值(每次都可以任意修改),才能让子树中任意2点的距离==他们权值差的绝对值 无解 ...

  8. Daiwa Securities Co. Ltd. Programming Contest 2022 Autumn (AtCoder Beginner Contest 277) A~C题详细讲解

    这次C题难得太突然,搞得博主有点手足无措,最后Rating掉了1分--(博主很菜) 赛时AC:A,B,C. 好,不说废话,直接上题解. 目录 A - ^{-1} B - Playing Cards V ...

  9. 2018 German Collegiate Programming Contest (GCPC 18)

    2018 German Collegiate Programming Contest (GCPC 18) Attack on Alpha-Zet 建树,求lca 代码: #include <al ...

最新文章

  1. html圆圈里面问号,html,css实现问号提示信息
  2. 精准扶贫电商重整流通-农业大健康·李玉庭: 谋定功能农产品
  3. 函数基本使用-函数的定义以及调用执行线路图
  4. 投递简历得不到回复,并不是你的简历不好,可能是这个原因
  5. QQ邮箱自动登录问题--frame嵌套元素定位
  6. 如何在桌面添加计算机日历工具,如何在电脑桌面上添加日历小工具?
  7. 驱动实验一(第一个驱动程序创建)
  8. MT4MT5跟单EA系统跨平台
  9. 【Google Play】创建 Google 开发者账号 ( 注册邮箱账号 | 创建开发者账号 )
  10. windbg 查看结构体_Windbg入门实战讲解
  11. mysql 切分_MySQL切分查询用法分析
  12. 电脑坏了怎么把硬盘的mysql数据恢复_硬盘坏了怎么恢复数据?
  13. 解决网络栏只剩下飞行模式
  14. 致爱丽丝 之MY收藏
  15. 网络视频服务器与数字硬盘录像机的区别
  16. 计算机快速结束进程,结束进程快捷键,详细教您电脑结束进程快捷键怎么操作...
  17. 温度滞回程序C语言,间隙式粘滞阻尼器温度变化对滞回性能影响的研究
  18. 【杰理AC632n】
  19. python顺序结构例题_python的顺序结构、选择结构、循环结构的练习代码
  20. ZStack实践汇 | 基于ZStack云平台部署FortiGate

热门文章

  1. div+css布局必了解的列表元素ul ol li dl dt dd详解
  2. 每天进步一点点《ML - 人工神经网络》
  3. leetcode链表篇
  4. 多元正态分布、多元t分布中的行列式求解 Java
  5. Python 对象的初始化函数及调用函数
  6. “源文件与模块生成时的文件不同,是否希望调试器使用它?”解决方案
  7. Androidstudio项目更换gradle版本
  8. Mosquitto 0 15 开源MQTT v3 1 Broker
  9. CButton按钮添加图片 Bitmap Icon
  10. android 的 sp 智能指针用法介绍 sp wp