HDU 1385 Minimum Transport Cost (最短路+记录路径+字典序)

来源:互联网 发布:好喝的白酒推荐知乎 编辑:程序博客网 时间:2024/06/07 23:39

题目链接:HDU 1385 Minimum Transport Cost


主要注意路径按字典序最小的输出。

字典序:1->2->3->4 的字典序比 1->3->2 要小。化成字符串处理之。


AC代码:


Dijkstra代码:

#include<stdio.h>#include<string.h>int map[50][50];const int INF=99999999;int pre[50],tax[50],n;int a,b;int Min(int x,int y){return x>y? y:x;}void dfs(int now,char *str)//路径化成字符串比较{int cnt=1,i;str[cnt]=now+'0';cnt++;int temp=pre[now];while(temp!=a){str[cnt]=temp+'0';cnt++;temp=pre[temp];}str[cnt]=a+'0';cnt++;str[cnt]='\0';char t;for(i=0;i<cnt/2;i++){t=str[i];str[i]=str[cnt-1-i];str[cnt-1-i]=t;}}bool cmp(int now,int front)//比较路径的字典序{char str1[100],str2[100];memset(str1,'\0',sizeof str1);memset(str2,'\0',sizeof str2);dfs(now,str1);dfs(front,str2);if(strcmp(str1,str2)<0)return true;return false;}int Dijkstra(int s,int d){int i,j,k,t,temp;bool vis[50];int dis[50];memset(dis,0,sizeof dis);memset(vis,false,sizeof vis);for(i=1;i<=n;i++){dis[i]=(s==i? 0:map[s][i]);if(dis[i]==INF)pre[i]=0;elsepre[i]=s;//赋值起点}vis[s]=true;dis[s]=0;for(i=1;i<=n;i++){t=INF;for(j=1;j<=n;j++){if(!vis[j] && dis[j]<t){t=dis[j];k=j;}}if(t==INF)break;vis[k]=true;for(j=1;j<=n;j++){if(!vis[j]){temp=dis[k]+map[k][j]+tax[k];if(temp<dis[j]){dis[j]=temp;pre[j]=k;//记录路径 k->j,}else if(temp==dis[j]){if(cmp(k,j))pre[j]=k;//k->j}}}}return dis[d];}void road1(int b,int s){int temp=b;if(pre[temp]!=b)//递归到起点road1(pre[temp],s+1);if(s!=0)printf("%d-->",b);elseprintf("%d\n",b);}int main(){int i,j;while(scanf("%d",&n)!=EOF,n){for(i=1;i<=n;i++){for(j=1;j<=n;j++){scanf("%d",&map[i][j]);if(map[i][j]==-1)map[i][j]=INF;}}for(i=1;i<=n;i++)scanf("%d",&tax[i]);while(scanf("%d %d",&a,&b)!=EOF){if(a==-1 && b==-1)break;printf("From %d to %d :\n",a,b);printf("Path: ");int ans=Dijkstra(a,b);road1(b,0);printf("Total cost : %d\n\n",ans);}}return 0;}



Floyd:

#include<stdio.h>#include<string.h>int map[50][50];int road[50][50];const int INF=99999999;int pre[50],tax[50],n;int count;int a,b;int Min(int a,int b){return a>b? b:a;}void Floyd(){int i,j,k;for(i=1;i<=n;i++)for(j=1;j<=n;j++){road[i][j]=j;}int temp;for(k=1;k<=n;k++)for(i=1;i<=n;i++)for(j=1;j<=n;j++){temp=map[i][k]+map[k][j]+tax[k];if(temp<map[i][j]){map[i][j]=temp;road[i][j]=road[i][k];}else if(temp==map[i][j]){road[i][j]=Min(road[i][j],road[i][k]);}}}void road1(){int temp=a;while(temp!=b){printf("%d-->",temp);temp=road[temp][b];}printf("%d\n",b);}int main(){int i,j;while(scanf("%d",&n)!=EOF,n){for(i=1;i<=n;i++){for(j=1;j<=n;j++){scanf("%d",&map[i][j]);if(map[i][j]==-1)map[i][j]=INF;}}for(i=1;i<=n;i++)scanf("%d",&tax[i]);Floyd();while(scanf("%d %d",&a,&b)!=EOF){if(a==-1 && b==-1)break;printf("From %d to %d :\n",a,b);printf("Path: ");road1();printf("Total cost : %d\n\n",map[a][b]);}}return 0;}


反思:这题主要考察对记录路径的认识和处理。Floyd的强大之处



0 0
原创粉丝点击