9.8 树与图提高组训练题解
------Frosty_Jackal
目录
医院设置(弗洛伊德)
黑暗城堡(乘法原理与Dij)
繁忙的都市(最小生成树版题)
走廊泼水节(最小生成树贪心)
最优贸易(最短路提高)
工资(拓扑排序)
对称二叉树(思维题)
小球(模拟)
弗洛伊德n的3次方处理出两点间最短路,再用n的2次方处理答案:第一层枚举 医院选择,第二层枚举其他的点到该医院总分,取最大总分。(不是最优的解法,解法很多)
long long ans=1e9;
for(int i=1;i<=n;i++)
{
long long sum=0;
for(int j=1;j<=n;++j) sum+=(1ll*dis[j][i]*edge[j]);(i,j可以不相等)
if(sum<ans) ans=sum;
}
(无重边)
用Dijk算法处理最短路,在处理最短路时,若有与最短路相等的边连入,则对于1到该点,满足题意的方案数+1,若更新该最短路,方案数变为1。
if(d[y]>d[x]+z)
{
pos[y]=1;
d[y]=d[x]+z;
q.push(make_pair(-d[y],y));
}
else if(d[y]==d[x]+z) pos[y]=(pos[y]+1)%mod;
由于方案等于第1点与第2点连边的方案 * 1与3连边的方案 *...1与n连边的方案,最终以乘法原理统计答案
for(int i=1;i<=n;i++){ans=(ans*pos[i])%mod;}
最小生成树模板题,只是多个统计最长边。第一个答案为n-1。
在kruskal的过程中,对于枚举的每一条边,答案+=两个并查集大小乘积【完全图】-1【减去当前最小生成树边】* (当前最小生成树边的权值+1)【满足不为最小生成树且权值尽量小的题意】
建正反图
在正图上从1开始
跑一遍最短路,找出D[x]表示从1到x路径上最小买价,
在反图上从n跑一遍最短路,找出F[x]表示从1到x路径上最大卖价,最后枚举一遍x找到最大的F[x]-D[x]即为答案。
判断ch[p*2]与ch[p*2+1]是否同“类型”
拓扑排序,建反图,入度为0则工资100,先由入度为0的点宽搜,对于相连的点可以由max(出发点的工资加+1,他自己的工资)更新,将入度为0的放进宽搜队列。记录队列中历史进入的点的总数to,若tot最后不为n则有环,输出Poor Xed。
方法很多,模拟,打表找规律...