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; }