牛客挑战赛36 A.环(数学、有向环)

题目链接:点击这里
在这里插入图片描述
在这里插入图片描述
题意理解错误,一直是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;
}
发布了673 篇原创文章 · 获赞 103 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/104033467