天天看點

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;

}