列表

详情


NC200531. 环

描述

在一个n个点(编号为1-n),n条边的中,每条边的长度等于它所连接的两个端点数字的和。

现已知将全图连通的n条边的长度,求各点上的数字

输入描述

第一行一个整数n。

接下来n行,每行3个正整数ai、bi、ci,ci表示连接点ai和bi的边的长度。数据保证合法。

输出描述

n行。每行一个正整数wi,表示点i上的数字。

示例1

输入:

3
1 2 3
2 3 5
1 3 4

输出:

1
2
3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 76ms, 内存消耗: 2132K, 提交时间: 2020-02-12 15:07:18

#include<bits/stdc++.h>
 
using namespace std;

const int maxn = 1e5+7;
int n; 
int nex[maxn], c[maxn];
int ans[maxn];

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n;
	for(int i=0, u, v, w; i<n; ++i){
		cin >> u >> v >> w;
		if(nex[u]!=0)swap(u, v);
		nex[u] = v;
		c[u] = w;
	}
	int j=1;
	int sum=0;
	for(int i=1; i<=n; ++i){
		if(i&1)sum+=c[j];
		else sum -= c[j];
		j=nex[j]; 
	}
	ans[1] = sum>>1;
	j = 1;
	for(int i=2; i<=n; ++i){
		ans[nex[j]] = c[j]-ans[j];
		j = nex[j];
	}
	for(int i=1; i<=n; ++i){
		cout<<ans[i]<<"\n";
	}
}

C++11(clang++ 3.9) 解法, 执行用时: 58ms, 内存消耗: 3800K, 提交时间: 2020-01-18 08:34:51

#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
int n;
int nxt[maxn],w[maxn],a[maxn];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int x,y,k;scanf("%d%d%d",&x,&y,&k);
		if(nxt[x])swap(x,y);
		nxt[x]=y;w[x]=k;
	}
	int x=nxt[1],now=1;
	a[1]=w[1];
	while(x!=1)
	{
		a[1]+=!now?w[x]:-w[x];
		now^=1;x=nxt[x];
	}
	a[1]>>=1;
	x=nxt[1];a[nxt[1]]=w[1]-a[1];
	while(nxt[x]!=1)
	{
		a[nxt[x]]=w[x]-a[x];
		x=nxt[x];
	}
	for(int i=1;i<=n;i++)printf("%d\n",a[i]);
	return 0;
}

上一题