树的直径来做的代码还是不知道为什么WA 求指正
用dfs的方法建的的无向图 (建有向图的话应该需要vis标记)
但是忘记初始化浪费了半天= =
#include<algorithm>
#include<stdio.h>
#include<iostream>
#include<vector>
#include<queue>
#define maxn 10005
using namespace std;
#define inf 1000000005
vector<int>G[maxn];
int vis[maxn];
int d1[maxn],d2[maxn];
int s,n;
struct Edge
{
int from,to,va;
};
vector<Edge>edges;
void AddEdge(int from,int to,int va)
{
edges.push_back((Edge){from,to,va});
edges.push_back((Edge){to,from,va});
int k =(int)edges.size();
G[from].push_back(k-2);
G[to].push_back(k-1);
}
void dep(int *d,int &s)
{
for(int i=1;i<=n;++i)
{
d[i]=inf;
vis[i]=0;
}
queue<int>q;
q.push(s);
vis[s]=1;
d[s]=0;
while(!q.empty())
{
s=q.front();
q.pop();
for(int i=0;i<G[s].size();++i)
{
Edge &x=edges[G[s][i]];
if(d[x.to]>d[s]+x.va){d[x.to]=d[s]+x.va;}
if(!vis[x.to])
{
vis[x.to]=1;
q.push(x.to);
}
}
}
}
int main()
{
while(~scanf("%d",&n))
{
memset(d1,0,sizeof d1);
memset(d2,0,sizeof d2);
int a,va;
for(int i=2;i<=n;++i)
{
scanf("%d%d",&a,&va);
AddEdge(i,a,va);
}
int t=1;
dep(d1,t);
// printf(" %d\n",t);
t=1;
for(int i=1;i<=n;++i)
{
// printf("%d ",d1[i]);
if(d1[i]>d1[t])
{t=i;}
}
// printf("\n");
dep(d1,t);
dep(d2,t);
for(int i=1;i<=n;++i)
{
printf("%d\n",max(d1[i],d2[i]));
}
for(int i=0;i<=n;++i)
{G[i].clear();}
edges.clear();
}
}
忘记初始化了 结果浪费了一个下午 真是太菜了
两次dfs方法来做的代码:
#include<stdio.h>
#include<algorithm>
//#include<cstring>
#include<string.h>
#include<iostream>
#include<vector>
using namespace std;
#define maxn 10010
struct Edge
{
int from,to,va;
};
void swap(int &a,int &b)
{
int c=a;
a=b;
b=c;
}
vector<Edge>edges;
vector<int> G[maxn];
int vis[maxn];
int fi[maxn],fin[maxn];
int se[maxn],sen[maxn];
void AddEdge(int from,int to,int va)
{
edges.push_back((Edge){from,to,va});
int m=(int)edges.size();
G[from].push_back(m-1);
}
void dfs1(int n)
{
for(int i=0;i<G[n].size();++i)
{
Edge &e=edges[G[n][i]];
// printf("sda %d",e.to);
dfs1(e.to);
if(se[n]<fi[e.to]+e.va)
{
se[n]=fi[e.to]+e.va;
sen[n]=e.to;
if(se[n]>fi[n])
{
swap(se[n],fi[n]);
swap(fin[n],sen[n]);
}
}
}
}
void dfs2(int n)
{
vis[n]=1;
for(int i=0;i<G[n].size();++i)
{
Edge &e =edges[G[n][i]];
if(vis[e.to]){continue;}
if(fin[n]==e.to)
{
if(se[n]+e.va>se[e.to])
{
se[e.to]=se[n]+e.va;
sen[e.to]=n;
if(se[e.to]>fi[e.to])
{
swap(se[e.to],fi[e.to]);
swap(sen[e.to],fin[e.to]);
}
}
}
else
{
if(fi[n]+e.va>se[e.to])
{
se[e.to]=fi[n]+e.va;
sen[e.to]=n; //方向
if(se[e.to]>fi[e.to])
{
swap(sen[e.to],fin[e.to]);
swap(se[e.to],fi[e.to]);
}
}
}
dfs2(e.to);
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int from,va;
memset(fi,0,sizeof fi);
memset(se,0,sizeof se);
memset(fin,0,sizeof fin);
memset(sen,0,sizeof sen);
for(int i=2;i<=n;i++)
{
scanf("%d%d",&from,&va);
AddEdge(from,i,va);
}
memset(vis,0,sizeof vis);
dfs1(1);
memset(vis,0,sizeof vis);
dfs2(1);
for(int i=1;i<=n;++i)
{printf("%d\n",fi[i]);}
for(int i=0;i<=n;++i)
{
G[i].clear();
}
edges.clear();
}
return 0;
}