hdu2923 Einbahnstrasse
来源:互联网 发布:淘宝网运动服女装套装 编辑:程序博客网 时间:2024/06/05 09:24
题意:
n个城市,c辆破车,r条路,求从公司出发把所有破车拖回(一次拖一个)的最少路程
思路:floyd算法或dijkstra算法;
WA了10次=_=(崩溃。。)用dijkstra的时候没用position存位置WA了2次,用floyd的时候没初始化cas,真想一头撞死在豆腐上。
注意:每座城市可能有好几辆破车,不仅要开过去还要拉回来
附上代码。。
floyd版
#include<cstdio>#include<cstring>#define INF 0x3f3f3f3f#define N 100int road[N+10][N+10];char name[N+10][15];int number;int position[N*10+10];void floyd(int n){ for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { //printf("%d->%d:%d %d>%d:%d %d->%d:%d\n",i,j,road[i][j],i,k,road[i][k],k,j,road[k][j]); if((road[i][k]!=INF)&&(road[k][j]!=INF)&&(road[i][j]>road[i][k]+road[k][j])) { road[i][j]=road[i][k]+road[k][j]; //printf("i=%d j=%d dis=%d\n",i,j,road[i][j]); } }}int findname(char *s)//找城市名字所对应的城市编号{ int i; for(i=1;i<=number;i++) if(strcmp(s,name[i])==0) return i; strcpy(name[number+1],s); number+=1; return number;}int main(){ int n,c,r,i,cas=0; while(scanf("%d%d%d",&n,&c,&r)!=EOF) { if(!n&&!c&&!r)break; memset(road,0x3f,sizeof(road));//初始化 for(i=1;i<=n;i++) road[i][i]=0; number=0;//当前已有城市编号 for(i=1;i<=c+1;i++) { char s[15]; scanf("%s",s); int t=findname(s); position[i]=t; } for(i=1;i<=r;i++) { char s1[25],s2[25],s3[25]; scanf("%s%s%s",s1,s2,s3); int t1=findname(s1); int t3=findname(s3); int t2=0; for(int j=0;s2[j]!='\0';j++)//算值 if(s2[j]>='0'&&s2[j]<='9') t2=t2*10+s2[j]-'0'; // printf("%d\n",t2); if(s2[0]=='<') { if(road[t3][t1]>t2) road[t3][t1]=t2; } if(s2[strlen(s2)-1]=='>') { if(road[t1][t3]>t2) road[t1][t3]=t2; } } floyd(n); int ans=0; for(i=2;i<=c+1;i++) { ans=ans+road[1][position[i]]+road[position[i]][1]; } cas++; printf("%d. %d\n",cas,ans); } return 0;}
dijkstra版
#include<cstdio>#include<cstring>#define INF 0x3f3f3f3f#define N 100int dist[N+10],vis[N+10],road[N+10][N+10];char name[N+10][15];int number;int position[N*10+10];void dijkstra(int from,int n){ memset(vis,0,sizeof(vis)); memset(dist,0x3f,sizeof(dist)); dist[from]=0; int i,j,now=-1,last=-1; for(i=1;i<=n;i++) { int mi=INF; for(j=1;j<=n;j++) if(!vis[j]&&dist[j]<mi) { now=j; mi=dist[j]; } if(last==now)break; last=now; vis[now]=1; for(j=1;j<=n;j++) if(dist[j]>dist[now]+road[now][j]) dist[j]=dist[now]+road[now][j]; }}int findname(char *s){ int i; for(i=1;i<=number;i++) if(strcmp(s,name[i])==0) return i; strcpy(name[number+1],s); number+=1; return number;}int main(){ int n,c,r,i,cas=0; while(scanf("%d%d%d",&n,&c,&r)!=EOF) { if(!n&&!c&&!r)break; memset(road,0x3f,sizeof(road)); for(i=1;i<=n;i++) road[i][i]=0; number=0; for(i=1;i<=c+1;i++) { char s[15]; scanf("%s",s); int t=findname(s); position[i]=t; } for(i=1;i<=r;i++) { char s1[25],s2[25],s3[25]; scanf("%s%s%s",s1,s2,s3); int t1=findname(s1); int t3=findname(s3); int t2=0; for(int j=0;s2[j]!='\0';j++) if(s2[j]>='0'&&s2[j]<='9') t2=t2*10+s2[j]-'0'; // printf("%d\n",t2); if(s2[0]=='<') { if(road[t3][t1]>t2) road[t3][t1]=t2; } if(s2[strlen(s2)-1]=='>') { if(road[t1][t3]>t2) road[t1][t3]=t2; } } dijkstra(1,n); int ans=0; for(i=2;i<=c+1;i++) ans+=dist[position[i]];//去 for(i=2;i<=c+1;i++)//回 { dijkstra(position[i],n); ans+=dist[1]; } cas++; printf("%d. %d\n",cas,ans); } return 0;}
0 0
- hdu2923 Einbahnstrasse
- HDU2923:Einbahnstrasse(Floyd)
- HDU2923:Einbahnstrasse(Floyd)
- HDU2923---Einbahnstrasse(map+floyd)
- HDU2923 Einbahnstrasse (最短路 floyd)
- hdu2923—Einbahnstrasse(spfa)
- hdu2923 Einbahnstrasse map+floyd最短路
- hdu2923
- hdu2923
- hdu2923
- hdu2923+floyd
- Einbahnstrasse HDU
- hdu2923 floyd基础
- hdu2923 最短路
- HDU 2923 Einbahnstrasse
- hdu 2923 Einbahnstrasse
- HDU 2923 Einbahnstrasse
- hdu 2923 Einbahnstrasse
- Lua 中得for while
- SQL Server之字符串函数
- java中static作用详解
- ThinkPHP学习笔记
- 如何判断文法是LL(1)SLR(1)LR(1)LALR(1)的?
- hdu2923 Einbahnstrasse
- 删除字符串中模式串
- Cocoa之NSDictionary总结
- UIScrollView 和 UIPageControl实现页面循环播放
- POJ 3461 kmp 应用
- 关于堆排序
- 中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030
- C语言数据类型转换详解
- 程序员的职业发展