电子销售网站报表模块如何做,宜兴公司做网站,管理培训网站建设,设计平台app正题 题目大意 nnn个点nnn条边的图#xff0c;每条边的边权为两个连接节点的权值和#xff0c;给出所有边权#xff0c;求每个节点权值#xff08;保证唯一的环为奇环#xff09; 解题思路
首先并查集找到环上相邻的两个点#xff0c;然后可以发现这两个点之间有两个关系…正题 题目大意
nnn个点nnn条边的图每条边的边权为两个连接节点的权值和给出所有边权求每个节点权值保证唯一的环为奇环 解题思路
首先并查集找到环上相邻的两个点然后可以发现这两个点之间有两个关系也就是两条路径可以求出其中一个点的权值然后推出其他点的权值即可 codecodecode
#includecstdio
#includecstring
#includealgorithm
#define ll long long
using namespace std;
const ll N1e510;
struct node{ll to,next,w;
}a[N*2];
ll n,fa[N],w[N],ls[N],tot,p1,p2,val;
ll find(ll x)
{return (fa[x]x)?x:(fa[x]find(fa[x]));}
void addl(ll x,ll y,ll w){a[tot].toy;a[tot].nextls[x];a[tot].ww;ls[x]tot;
}
void dfs(ll x,ll fa,ll dis){if(xp2){w[p1](val-dis)/2;return;}for(ll ils[x];i;ia[i].next){ll ya[i].to;if(yfa)continue;dfs(y,x,a[i].w-dis);}
}
void solve(ll x,ll fa){for(ll ils[x];i;ia[i].next){ll ya[i].to;if(yfa)continue;w[y]a[i].w-w[x];solve(y,x);}
}
int main()
{
int size 256 20; //250M
char*p(char*)malloc(size) size;
__asm__(movl %0, %%esp\n :: r(p) );scanf(%lld,n);for(ll i1;in;i)fa[i]i;for(ll i1;in;i){ll x,y,Fa,Fb,w;scanf(%lld%lld%lld,x,y,w);Fafind(x);Fbfind(y);if(FaFb)swap(Fa,Fb);if(FaFb)p1x,p2y,valw;else addl(x,y,w),addl(y,x,w),fa[Fa]Fb;}dfs(p1,0,0);solve(p1,0);for(ll i1;in;i)printf(%lld\n,w[i]);
}