#include"iostream"
#include"iomanip"
#include"stdlib.h"
#include"queue"
#define INF 0x7fffffff
using namespace std;
bool inqueue[2000];
int graph[400][400],dist[2000];
int n;
int pre[2000],b[1000];
void INIT()
{
int i,j;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
{
if(i==j)
graph[i][j]=0;
else
graph[i][j]=INF;
}
}
void OUTPUT(int begin,int end)
{
printf("From %d to %d :\n",end,begin);
printf("Path: %d",end);
while(pre[end]!=0)
{ printf("-->%d",pre[end]); end=pre[end];}
printf("\n");
};
void SPFA(int begin,int end)
{
int h,i;
queue<int>q;
dist[begin]=0;
inqueue[begin]=true;
q.push(begin);
while(!q.empty())
{
h=q.front();
q.pop();
inqueue[h]=false;
pre[begin]=0;
for(i=1;i<=n;i++)
{
if(graph[h][i]!=INF&&dist[i]>graph[h][i]+dist[h])
{
dist[i]=graph[h][i]+dist[h];
pre[i]=h; //未按照字典序
if(!inqueue[i])
{q.push(i);inqueue[i]=true;}
}
else if(i!=h&&dist[i]==graph[h][i]+dist[h])
{
if(h<pre[i])
pre[i]=h; }
}
}
if(begin==end)
{ printf("From %d to %d :\n",end,begin);
printf("Path: %d\n",begin);
printf("Total cost : 0\n\n");}
else
{ OUTPUT(begin,end);
printf("Total cost : %d\n\n",dist[end]-b[begin]);
}
// printf("%d\n",dist[end]);
}
int main()
{
int start,end,i,j,k,y;
while(scanf("%d",&n)!=EOF&&n)
{
INIT();
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{ scanf("%d",&y); if(y!=-1) graph[j][i]=y; if(y==-1) graph[j][i]=INF;} //jian fan tu
for(k=1;k<=n;k++)
{
scanf("%d",&b[k]);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if((i==k)&&(i!=j)&&graph[i][j]!=INF)
graph[i][j]+=b[k];
}
}
while(scanf("%d%d",&start,&end)!=EOF&&start!=-1&&end!=-1)
{
memset(pre,9999,sizeof(pre));
for(i=0;i<=n;i++)
{inqueue[i]=false;dist[i]=INF;}
SPFA(end,start);
}
}
return 0;
}
HDU 1385 Minimum Transport Cost
最新推荐文章于 2024-10-09 10:07:13 发布