java 大臣的旅费_蓝桥杯 大臣的旅费

大臣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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值