樹的直徑poj1985
阿新 • • 發佈:2019-05-06
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