poj2631 Roads in the North

poj2631
题意就是求树的直径…树的直径的求法就是两边dfs或者两边bfs吧【捂脸】…感觉两个速度一样诶【捂脸】
证明就是反证法,网上好多人都有证明..这里就不证了..可以看这里【捂脸】
做法就是第一次求出一个端点..然后再从这个端点找最长的路径…

dfs

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
#define N 11000
struct node{int x,y,z,next;}edge[2*N];
int d[N],vis[N],h[N],max1,pos,num=0;
void insert(int x,int y,int z){
    edge[++num].x=x;edge[num].y=y;edge[num].z=z;edge[num].next=h[x];h[x]=num;
    edge[++num].x=y;edge[num].y=x;edge[num].z=z;edge[num].next=h[y];h[y]=num;
}
void dfs(int x){
    for(int i=h[x];i;i=edge[i].next){
        int y=edge[i].y;
        if(vis[y]) continue;
        d[y]=d[x]+edge[i].z;vis[y]=1;dfs(y);
        if(d[y]>max1) max1=d[y],pos=y;
    }
}
int main(){
    int x,y,z;while(scanf("%d%d%d",&x,&y,&z)>0) insert(x,y,z);
    memset(d,0,sizeof(d));memset(vis,0,sizeof(vis));vis[1]=1;max1=0;dfs(1);
    memset(d,0,sizeof(d));memset(vis,0,sizeof(vis));vis[pos]=1;max1=0;dfs(pos);
    printf("%d\n",max1); 
    return 0;
} 

bfs

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
#define N 11000
struct node{int x,y,z,next;}edge[2*N];
int d[N],vis[N],h[N],max1,pos,num=0;
void insert(int x,int y,int z){
    edge[++num].x=x;edge[num].y=y;edge[num].z=z;edge[num].next=h[x];h[x]=num;
    edge[++num].x=y;edge[num].y=x;edge[num].z=z;edge[num].next=h[y];h[y]=num;
}
void bfs(int x){
    memset(d,0,sizeof(d));max1=0;pos=x;
    memset(vis,0,sizeof(vis));vis[x]=1;
    queue<int>q;q.push(x);
    while(!q.empty()){
        int u=q.front();q.pop();
        for(int i=h[u];i;i=edge[i].next){
            int v=edge[i].y;if(vis[v]) continue;
            d[v]=d[u]+edge[i].z;vis[v]=1;q.push(v);
            if(d[v]>max1) pos=v,max1=d[v];
        }
    }
}
int main(){
    int x,y,z;while(scanf("%d%d%d",&x,&y,&z)>0) insert(x,y,z);
    bfs(1);bfs(pos);
    printf("%d\n",max1); 
    return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值