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
- HDU 1385 Minimum Transport Cost (最短路+记录路径+字典序)
- hdu 1385 Minimum Transport Cost(最短路+记录路径)
- hdu 1385 Minimum Transport Cost(最短路 + 字典序最小路径)
- hdu 1385 Minimum Transport Cost(最短路,floyd打印字典序路径)
- HDU 1385 Minimum Transport Cost【最短路之路径记录】
- HDU 1385 Minimum Transport Cost 最短路+字典序
- HDU 1385 Minimum Transport Cost (字典序打印最短路)
- HDOJ--1385--Minimum Transport Cost(最短路记录路径)
- HDU 1385 Minimum Transport Cost(最短路,打印字典序路径)
- hdu 1385 Minimum Transport Cost 最短路 + 打印字典序最小路径
- hdu 1385 Minimum Transport Cost(最短路+字典序+打印路径)
- HDU - 1385 Minimum Transport Cost(最短路+最小字典序路径)
- HDU 1385 Minimum Transport Cost(最短路,打印字典序路径)
- hdu 1385 Minimum Transport Cost(最短路+输出路径)
- HDOJ 1385 Minimum Transport Cost (最短路 Floyd & 路径记录)
- Minimum Transport Cost hdu 1385(最短路 + 路径保存 + stack)
- hdu 1385 Minimum Transport Cost 最短路加路径输出
- HDU 1385Minimum Transport Cost 最短路输出路径
- 怎样找回照相机中已经删除的照片,数码相机照片数据删除怎么恢复
- Android-10-拨号器
- 免费使用Adobe Flash Builder 4.5方法 不用注册码
- openwrt 有线无线配置
- Error injecting constructor, java.net.UnknownHostException: *****
- HDU 1385 Minimum Transport Cost (最短路+记录路径+字典序)
- 华为机试整理
- 排列
- 我的照片被涂鸦了怎么恢复
- POJ 2524 Ubiquitous Religions (幷查集)
- Android中RelativeLayout各个属性的含义
- 算法竞赛入门经典(第2版)习题3-12 浮点数 Floating-Point Numbers UVa11809
- MyEclipse里WEB-INF显示classes附Web开发目录结构
- 加沙问题的相关概念