大臣J从城市4到城市5要花费135的路费。
方法1:由于两个城市之间仅仅有一种方法到达,所以能够採用floyd的方法求出随意两点间的最短距离,由于仅仅有一种方法。然后求出这些最短路径中的最大值就可以。
可是这样仅仅能通过75%的数据。
#include
#include
#define inf 1<<10
#define N 101
int dp[N][N];
int main()
{
int n,i,j,k,a,b,d,longest=0,sum=0;
for(i=1;i
for(j=1;j
dp[i][j]=inf;
for(i=1;i
dp[i][i]=0;
scanf("%d",&n);
for(i=0;i
{
scanf("%d%d%d",&a,&b,&d);
dp[a][b]=d;
dp[b][a]=d;
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
dp[i][j] = dp[i][j]>dp[i][k]+dp[k][j]?dp[i][k]+dp[k][j]:dp[i][j];//floyd算法的模板
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(dp[i][j]longest)
longest=dp[i][j];
printf("%d\n",longest*(21+longest)/2);
//system("pause");
return 0;
}
方法二:动态规划
#include
#include
using namespace std;
#define MAXN 100010 //不知n为多大,随便定义了个。能够定义更大。也能够想想用vector容器
#define LL long long
int n;
LL Dp[MAXN],Max[MAXN],ans;//全区变量自己主动初始化为0
//链式前向星
int head[MAXN],m=1;//由于head[]中元素都为0,所以m从1计数就不用初始化head[]了
struct Edge{
int to,next,w;
}e[MAXN];
//链式前向星加入边
void add_edge(int u,int v,int w){//邻接表的模板
e[m].to = v;
e[m].w = w;
e[m].next = head[u];
head[u] = m++;
}
bool f[MAXN];//标记节点是否已被訪问过
void dfs(int s){
int k = head[s];
while(k > 0){
int t = e[k].to;//t为s的孩子节点
if(!f[t]){
f[t] = true;
dfs(t);
Max[s] = max(Max[s] , Dp[s] + Dp[t]+e[k].w);//以s为根节点的子树中 经过s的最大两点间距离
Dp[s] = max(Dp[s] , Dp[t]+e[k].w);//s到叶子节点的最长距离
}
k = e[k].next;
}
ans=max(ans,Max[s]);
}
void work(){
f[1]=true;
dfs(1);//以节点1为根节点深搜 。深搜前标记1被訪问
printf("%I64d\n",ans*(21+ans)/2);
}
void init(){
scanf("%d",&n);
int p,q,d;
for(int i = 1 ; i < n ; i++){
scanf("%d%d%d",&p,&q,&d);
add_edge(p,q,d);
add_edge(q,p,d);//双向边建图,方便dfs
}
}
int main()
{
init();
work();
return 0;
}