网站建设优化公司,中铁广州建设有限公司网站,wordpress网页psd下载,网络营销心得体会P1131 [ZJOI2007] 时态同步
题意#xff1a;
有一颗树#xff0c;有一个点是激发器#xff0c;从这个点开始可以产生一个激励电流#xff0c;通过导线传向每一个它所连接的节点#xff0c;经过一个边的花费为w[i],你有一个道具#xff0c;每用一次可以让一个边的花费1
有一颗树有一个点是激发器从这个点开始可以产生一个激励电流通过导线传向每一个它所连接的节点经过一个边的花费为w[i],你有一个道具每用一次可以让一个边的花费1问最少操作多少次使得到所有叶子节点的花费一样
题解
我们只能延长边权不能缩短边权 我们可以从最深的子树开始把所有子节点调整到同一深度再到上一层调整上一层的树枝 为什么这样最优因为这样我们会往后调整靠根节点的树枝而调整靠根节点的树枝会让其下所有叶子节点同时移动这样可以做到花最小的费用实现最多的事 可以简单理解成让更多人的人上车后再发车 这样可以保证代价最少 每次调整代价就是根节点的深度减去 其儿子节点的深度 再减 边权
代码
// Problem: P1131 [ZJOI2007] 时态同步
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1131
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// By Jozky#include bits/stdc.h
#include unordered_map
#define debug(a, b) printf(%s %d\n, a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pairint, int PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll 1e18;
const int INF_int 0x3f3f3f3f;
void read(){};
template typename _Tp, typename... _Tps void read(_Tp x, _Tps... Ar)
{x 0;char c getchar();bool flag 0;while (c 0 || c 9)flag| (c -), c getchar();while (c 0 c 9)x (x 3) (x 1) (c ^ 48), c getchar();if (flag)x -x;read(Ar...);
}
template typename T inline void write(T x)
{if (x 0) {x ~(x - 1);putchar(-);}if (x 9)write(x / 10);putchar(x % 10 0);
}
void rd_test()
{
#ifdef ONLINE_JUDGE
#elsestartTime clock();freopen(data.in, r, stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#elseendTime clock();printf(\nRun Time:%lfs\n, (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn 1e6 9;
vectorPII vec[maxn];
ll ans 0;
ll dis[maxn];
void dfs(int u, int fa)
{int maxx 0;for (auto it : vec[u]) {int v it.first;int w it.second;if (v fa)continue;dfs(v, u);//根节点到叶子节点的最大距离dis[u] max(dis[u], dis[v] w);}for (auto it : vec[u]) {int v it.first;int w it.second;if (v fa)continue;//每次调整的代价ans dis[u] - (dis[v] w);}
}
int main()
{//rd_test();int n, s;read(n, s);for (int i 1; i n; i) {int u, v, w;read(u, v, w);vec[u].push_back({v, w});vec[v].push_back({u, w});}dfs(s, 0);cout ans endl;//Time_test();
}