1. 程式人生 > >poj 1895(最長鏈)

poj 1895(最長鏈)

max include scan har printf namespace name esp ons

在樹內任找一點,找到離他最遠的點,這個點必是樹徑的一個端點

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=100000+100;
const int inf=0x3f3f3f3f;
int n,k,m;
int vis[maxn],d[maxn];
struct note
{
    int next;
    int to;
    
int len; } aa[maxn]; int hade[maxn]; void addage(int fr,int to,int len) { aa[k].len=len; aa[k].to=to; aa[k].next=hade[fr]; hade[fr]=k++; } void bfs(int x) { memset(vis,0,sizeof(vis)); memset(d,inf,sizeof(d)); d[x]=0; vis[x]=1; queue<int> q; q.push(x);
while(q.size()) { int u=q.front(); q.pop(); for(int i=hade[u]; i!=-1; i=aa[i].next) { int v=aa[i].to; if(!vis[v]&&d[u]+aa[i].len<d[v]) { d[v]=d[u]+aa[i].len; vis[v]=1; q.push(v); } } } }
int main() { while(~scanf("%d%d",&n,&m)) { k=0; memset(hade,-1,sizeof(hade)); int fr,to,len; for(int i=1; i<=m; i++) { scanf("%d%d%d",&fr,&to,&len); getchar(); getchar(); addage(fr,to,len); addage(to,fr,len); } bfs(1); int maxi=-1,kk=0; for(int i=1; i<=n; i++) { if(maxi<d[i]) { kk=i; maxi=d[i]; } } bfs(kk); for(int i=1; i<=n; i++) if(maxi<d[i]) { maxi=d[i]; } printf("%d\n",maxi); } return 0; }

poj 1895(最長鏈)