程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 1385 Minimum Transport Cost (floyd算法)

hdu 1385 Minimum Transport Cost (floyd算法)

編輯:C++入門知識

貌似····················

這個算法深的東西還是很不熟悉!繼續學習!!!!

++++++++++++++++++++++++++++

============================

++++++++++++++++++++++++++++

-------------------------------------------------

============================

#include<stdio.h>

#include<string.h>
#define MAX 10000000
#define N 1001


int a[N][N],b[N],next[N][N];
int n,len;


void floyd()
{
int i,j,k,fee;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
next[i][j]=j;
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
if(i==k||a[i][k]==-1)
continue;
for(j=1;j<=n;j++)
{
if(a[k][j]==-1||i==k||j==k)
continue;
fee=a[i][k]+a[k][j]+b[k];
if(a[i][j]==-1||a[i][j]>fee)
{
a[i][j]=fee;
next[i][j]=next[i][k];
}
else if(a[i][j]==fee)
{
if(next[i][j]>next[i][k])
next[i][j]=next[i][k];
}
}
}
}
}
void path(int start,int end)
{
if(end==next[start][end])
printf("%d-->%d\n",start,end);
else
{
printf("%d-->",start);
path(next[start][end],end);
}
}


int main()
{
int i,j,start,end;
while(scanf("%d",&n),n)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=MAX;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for(i=1;i<=n;i++)
scanf("%d",&b[i]);
floyd();
while(scanf("%d%d",&start,&end)!=EOF)
{

if(start==-1||end==-1)
break;
printf("From %d to %d :\n",start,end);
if(start==end)//特別注意:當始點與終點相同時的輸出格式!
printf("Path: %d\n",start);
else
{
printf("Path: ");
path(start,end);
}
printf("Total cost : %d\n\n",a[start][end]);
}
}
return 0;

}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved