ÓÉÊ÷µÄÖ±¾¶¶¨Òå¿ÉµÃ,Ê÷ÉÏÈÎÒâÒ»µãµ½Ê÷µÄÖ±¾¶ÉϵÄÁ½¸ö¶ËµãÖ®Ò»µÄ¾àÀëÊÇ×µÄ...
Èý±éBFSÇóÊ÷µÄÖ±¾¶²¢Ô¤´¦Àí¾àÀë.......
3 2 3 4 4
#include#include #include #include #include using namespace std; const int maxn=20010; struct Edge { int to,next,w; }edge[maxn*2]; int Adj[maxn],Size; void init() { memset(Adj,-1,sizeof(Adj)); Size=0; } void add_edge(int u,int v,int w) { edge[Size].to=v; edge[Size].w=w; edge[Size].next=Adj[u]; Adj[u]=Size++; } int dist_s[maxn],dist_t[maxn],dist[maxn]; int n; bool vis[maxn]; int bfs1() { int ret=1; queue q; memset(vis,false,sizeof(vis)); q.push(1); dist[1]=0; vis[1]=true; while(!q.empty()) { int u=q.front(); q.pop(); for(int i=Adj[u];~i;i=edge[i].next) { int v=edge[i].to; int c=edge[i].w; if(vis[v]) continue; dist[v]=dist[u]+c; vis[v]=true; q.push(v); if(dist[v]>dist[ret]) ret=v; } } return ret; } int bfs2(int x) { int ret=x; queue q; memset(vis,false,sizeof(vis)); q.push(x); vis[x]=true; dist_s[x]=0; while(!q.empty()) { int u=q.front(); q.pop(); for(int i=Adj[u];~i;i=edge[i].next) { int v=edge[i].to; int c=edge[i].w; if(vis[v]==true) continue; vis[v]=true; dist_s[v]=dist_s[u]+c; q.push(v); if(dist_s[v]>dist_s[ret]) ret=v; } } return ret; } int bfs3(int x) { int ret=x; queue q; memset(vis,false,sizeof(vis)); q.push(x); vis[x]=true; dist_t[x]=0; while(!q.empty()) { int u=q.front(); q.pop(); for(int i=Adj[u];~i;i=edge[i].next) { int v=edge[i].to; int c=edge[i].w; if(vis[v]==true) continue; vis[v]=true; dist_t[v]=dist_t[u]+c; q.push(v); if(dist_t[v]>dist_t[ret]) ret=v; } } return ret; } int main() { while(scanf("%d",&n)!=EOF) { init(); memset(dist_s,0,sizeof(dist_s)); memset(dist_t,0,sizeof(dist_t)); memset(dist,0,sizeof(dist)); for(int i=2;i<=n;i++) { int x,w; scanf("%d%d",&x,&w); add_edge(x,i,w); add_edge(i,x,w); } int s=bfs1(); int t=bfs2(s); bfs3(t); //cout<<"s: "<