树网的核(树的直径)
来源:互联网 发布:知乎日语自学用书 编辑:程序博客网 时间:2024/05/17 07:14
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=310;
int n,s,fa[maxn],d[maxn],dis[maxn][maxn],vis[maxn],head[2*maxn],cur,maxx=-1,
nxt[2*maxn],cnt,v[2*maxn],ww[2*maxn],ans=100000000,l,r;
void add(int x,int y,int z){
++cnt; v[cnt]=y; ww[cnt]=z;nxt[cnt]=head[x]; head[x]=cnt;
}
void dfs(int x,int y){
fa[x]=y;
for(int i=head[x];i;i=nxt[i]){
if(v[i]==y) continue;
dfs(v[i],x);
}
}
void dfs1(int x){
vis[x]=true;
for(int i=head[x];i;i=nxt[i]){
if(vis[v[i]]) continue;
d[v[i]]=d[x]+ww[i];
if(d[v[i]]>maxx){
maxx=d[v[i]]; cur=v[i];
}
dfs1(v[i]);
}
}
int main(){
scanf("%d%d",&n,&s);
int u,v,w;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
if(i!=j) dis[i][j]=200000000;
else dis[i][j]=0;
}
for(int i=1;i<n;i++){
scanf("%d%d%d",&u,&v,&w);
dis[u][v]=dis[v][u]=w;
add(u,v,w); add(v,u,w);
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dis[i][k]<200000000&&dis[k][j]<200000000)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
dfs(1,0); d[1]=0; dfs1(1); memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d)); l=cur;
maxx=-1; dfs1(cur); r=cur;
//cout<<l<<' '<<r<<endl;
/*for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<dis[i][j]<<' ';
}
cout<<endl;
}*/
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dis[i][l]+dis[i][r]!=dis[l][r]) continue;
if(dis[i][j]>s||dis[j][l]+dis[j][r]!=dis[l][r]) continue;
int now=max(min(dis[l][i],dis[l][j]),min(dis[r][i],dis[r]
[j]));
ans=min(ans,now);
}
}
cout<<ans<<endl;
return 0;
}
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=310;
int n,s,fa[maxn],d[maxn],dis[maxn][maxn],vis[maxn],head[2*maxn],cur,maxx=-1,
nxt[2*maxn],cnt,v[2*maxn],ww[2*maxn],ans=100000000,l,r;
void add(int x,int y,int z){
++cnt; v[cnt]=y; ww[cnt]=z;nxt[cnt]=head[x]; head[x]=cnt;
}
void dfs(int x,int y){
fa[x]=y;
for(int i=head[x];i;i=nxt[i]){
if(v[i]==y) continue;
dfs(v[i],x);
}
}
void dfs1(int x){
vis[x]=true;
for(int i=head[x];i;i=nxt[i]){
if(vis[v[i]]) continue;
d[v[i]]=d[x]+ww[i];
if(d[v[i]]>maxx){
maxx=d[v[i]]; cur=v[i];
}
dfs1(v[i]);
}
}
int main(){
scanf("%d%d",&n,&s);
int u,v,w;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
if(i!=j) dis[i][j]=200000000;
else dis[i][j]=0;
}
for(int i=1;i<n;i++){
scanf("%d%d%d",&u,&v,&w);
dis[u][v]=dis[v][u]=w;
add(u,v,w); add(v,u,w);
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dis[i][k]<200000000&&dis[k][j]<200000000)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
dfs(1,0); d[1]=0; dfs1(1); memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d)); l=cur;
maxx=-1; dfs1(cur); r=cur;
//cout<<l<<' '<<r<<endl;
/*for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<dis[i][j]<<' ';
}
cout<<endl;
}*/
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dis[i][l]+dis[i][r]!=dis[l][r]) continue;
if(dis[i][j]>s||dis[j][l]+dis[j][r]!=dis[l][r]) continue;
int now=max(min(dis[l][i],dis[l][j]),min(dis[r][i],dis[r]
[j]));
ans=min(ans,now);
}
}
cout<<ans<<endl;
return 0;
}
阅读全文
0 0
- 树网的核(floyd,树直径)
- 树网的核(树的直径)
- poj4607(树的直径)
- 树的直径(模板)
- bzoj3124 [Sdoi2013]直径 树的直径
- 【树的直径】
- 树的直径
- 求树的直径
- 树的最长直径
- HDU4607 树的直径
- URAL1056(树的直径)
- 树的直径hdu3721
- 树的直径
- 树的直径
- 树的重心、直径
- 树的直径
- 树的直径 【总结】
- poj1985 树的直径
- mysql 权限管理
- URL路径映射
- DOS命令
- centos 安装vmware tools
- java 换行符
- 树网的核(树的直径)
- 动态加载之后js失效
- android多线程以及线程池使用
- java.math.BigDecimal
- Android中从网上下载一张图片显示进度并显示下载好的图片
- 杂记
- 10月17日云栖精选夜读:什么是新零售?阿里巴巴最新的报告终于说清楚了!(附报告)
- HPE提供集合套件作为经营决策
- MySQL练习-employees数据库(一)