如果一个网站的域名是一个网站项目多少钱
如果一个网站的域名是,一个网站项目多少钱,做网站建设公司网易互客,wordpress规则正题 题目大意
刚开始一棵树#xff0c;在树中加入k条边(k2)使得这些边都得走过的情况下#xff0c;每个点都到达并回到原点的最少边。 解题思路
首先我们发现如果不加边的话答案是2∗(n−1)2*(n-1)2∗(n−1)。 之后我们考虑k1k1k1的情况#xff0c;我们找树的直径在树中加入k条边(k2)使得这些边都得走过的情况下每个点都到达并回到原点的最少边。 解题思路
首先我们发现如果不加边的话答案是2∗(n−1)2*(n-1)2∗(n−1)。 之后我们考虑k1k1k1的情况我们找树的直径然后在两个端点之间加边这样就可以少跑直径长度-1这么多。设直径长度为disdisdis答案是2∗(n−1)−dis12*(n-1)-dis12∗(n−1)−dis1。
之后我们考虑k2k2k2的情况。我们发现如果之后再找一条直径和之前的直径没有重边的话答案就是2∗(n−1)−dis−dis222*(n-1)-dis-dis222∗(n−1)−dis−dis22。
有重边怎么办我们发现如果有重边那么重边就会多跑一次。所以我们可以把第一次直径上所有边权都变成−1-1−1我们就可以直接2∗(n−1)−dis−dis222*(n-1)-dis-dis222∗(n−1)−dis−dis22。
根据zyczyczyc的说法第一次用dfsdfsdfs方便记录路径第二次有负边权所以得用dpdpdp。
完美解决该题 codecodecode
#includecstdio
#includealgorithm
#includecstring
#define N 100010
using namespace std;
int n,k,dis,dis2,ls[N],tot;
int pre[N],last,f[N],p,x,y;
struct node{int to,w,next;
}a[2*N];
void addl(int x,int y,int w)//加边
{a[tot].toy;a[tot].ww;a[tot].nextls[x];ls[x]tot;
}
void dfs(int x,int fa,int disr)//第一次求直径
{if(disrdis) disdisr,px;for(int ils[x];i;ia[i].next)if(a[i].to!fa)pre[a[i].to]x,dfs(a[i].to,x,disra[i].w);
}
void change(int x,int end)//改变边权
{if(xend) return;for(int ils[x];i;ia[i].next)if(a[i].topre[x]){a[i].w-1;a[i^1].w-1;change(a[i].to,end);}
}
void dp(int x,int fa)//第二次求直径
{for(int ils[x];i;ia[i].next)if(a[i].to!fa){int ya[i].to;dp(a[i].to,x);dis2max(dis2,f[x]f[y]a[i].w);f[x]max(f[y]a[i].w,f[x]);}
}
int main()
{tot1;scanf(%d%d,n,k);for(int i1;in;i){scanf(%d%d,x,y);addl(x,y,1);addl(y,x,1);}dfs(1,0,0);lastp;dis0;dfs(p,0,0);if(k1){printf(%d,2*(n-1)-dis1);return 0;}change(p,last);dp(1,0);printf(%d,2*(n-1)-dis-dis22);
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/87938.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!