蓝桥杯 历届试题 大臣的旅费

。。。其实题意就是树的直径。。。

感觉自己挺傻逼的。。。直径就懂 最远路就不懂。。。

求直径就不用说了吧。。。自己查去。。。


。。。莫名其妙写了个O(n)的DP。。。

#include 
#include 
#include 
#include 
using namespace std;

const int N=10010;
struct edge
{
	int go,v,next;
};
edge eg[2*N];
int last[N],fm[N],sm[N];
//fm[] first max 记儿子、孙子等到该节点的最远路 sm[] 次远路 
//当然,这两个值不能来自于同一个子树,因为不能重复经过结点
int tot=0;

void add(int x,int y,int z)
{
	eg[++tot].go=y;
	eg[tot].v=z;
	eg[tot].next=last[x];
	last[x]=tot;
}

void dfs(int x,int fa)
{
	if (last[x]==0) return;
	int p=0,q=0,i;
	for (i=last[x];i;i=eg[i].next)
	{
		int u=eg[i].go;
		if (u==fa) continue;
		dfs(u,x);
		if (eg[i].v+fm[u]>p)
		{
			q=p;
			p=eg[i].v+fm[u];
		}
		else if (eg[i].v+fm[u]>q) q=eg[i].v+fm[u];
	}
	fm[x]=p;sm[x]=q;
}

int main()
{
	int n,i,x,y,z,ans;
	scanf("%d",&n);
	for (i=1;i

有人表示开始走的时候应该是从第0千米走到第1千米,费用怎么会是11呢 = =

我觉得很有道理啊。。。

当然题目和样例怎么算大家就怎么算吧。。。不能假定所有人说话都是精准的 =。= 

你可能感兴趣的:(ACM——图论)