题目链接:点击这里
题意理解错误,一直是60%。
思路:
设环上点的编号依次为pi,各边长度依次为Vi。
Wp1+Wp2=V1——①
Wp2+Wp3=V2——②
Wp3+Wp4=V3——③
……
Wpn+Wp1=Vn——(n)
①-②+③…+(n),得2Wp1=V1-V2+V3-…+Vn。
解出Wp1后再依次推出Wpi。
注意:
扫描二维码关注公众号,回复:
8744579 查看本文章
顶点编号不是按顺序来的,可以考虑成有向环。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int Next[maxn], weight[maxn], ans[maxn];
int main()
{
int n, x, y, z;
scanf("%d", &n);
for(int i = 1; i <= n; i++) //输入n条边,构成有向环
{
scanf("%d%d%d", &x, &y, &z);
if(Next[x]!=0) swap(x, y);
Next[x] = y;
weight[x] = z;
}
int j = 1; //起点从1开始
int sum = 0;
for(int i = 1; i <= n; i++) //共n条边,故循环n次
{
//二进制最末位为0表示偶数,最末位为1表示奇数
if(i&1) sum += weight[j];
else sum -= weight[j];
j = Next[j];
}
//左移1位就是乘以2,右移1位就是除以2
ans[1] = sum>>1;
j = 1;
for(int i = 2; i <= n; i++) //剩余n-1个点,故循环n-1次
{
ans[Next[j]] = weight[j] - ans[j];
j = Next[j];
}
for(int i = 1; i <= n; i++)
printf("%d\n", ans[i]);
return 0;
}