1. 程式人生 > >樹的直徑poj1985

樹的直徑poj1985

urn book getc while char arp 葉子節點 poj sha

樹的直徑:

利用了樹的直徑的一個性質:距某個點最遠的葉子節點一定是樹的某一條直徑的端點。

先從任意一頂點a出發,bfs找到離它最遠的一個葉子頂點b,然後再從b出發bfs找到離b最遠的頂點c,那麽b和c之間的距離就是樹的直徑。

用dfs也可以。

http://poj.org/problem?id=1985

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
inline int read(){
	int sum=0,x=1;
	char ch=getchar();
	while(ch<‘0‘||ch>‘9‘){
		if(ch==‘-‘)
			x=0;
		ch=getchar();
	}
	while(ch>=‘0‘&&ch<=‘9‘)
		sum=(sum<<1)+(sum<<3)+(ch^48),ch=getchar();
	return x?sum:-sum;
}
inline void write(int x){
	if(x<0)
		putchar(‘-‘),x=-x;
	if(x>9)
		write(x/10);
	putchar(x%10+‘0‘);
}
const int M=4e4+4;
struct node{
	int v,w,nextt;
}e[M<<1];
int head[M],book[M],dis[M],n,flag,maxx,tot,b;
void bfs(int s){
	if(!flag)
		flag=1;
	else{
		for(int i=0;i<=n;i++)
			book[i]=0,dis[i]=0;
	}
	book[s]=1;
	queue<int>que;
	que.push(s);
	b=s;
	maxx=0;
	while(!que.empty()){
		int u=que.front();
		que.pop();
		for(int i=head[u];~i;i=e[i].nextt){
			int v=e[i].v;
			if(!book[v]){
				book[v]=1;
				que.push(v);
				dis[v]=dis[u]+e[i].w;
				if(dis[v]>maxx){
					maxx=dis[v];
					b=v;
				}
			}
		}
	}
}
void addedge(int u,int v,int w){
	e[tot].v=v;
	e[tot].w=w;
	e[tot].nextt=head[u];
	head[u]=tot++;
}
char s[2];
int main(){
	int m;
	n=read(),m=read();
	for(int i=0;i<=n;i++)
		head[i]=-1;
	while(m--){
		int u=read(),v=read(),w=read();
		scanf("%s",s);
		addedge(u,v,w);
		addedge(v,u,w);
	}
	bfs(1);
	bfs(b);
	write(maxx);
	putchar(‘\n‘);
	return 0;
}

  

樹的直徑poj1985