Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19487 Accepted Submission(s): 4578
6 xiasha westlake xiasha station 60 xiasha ShoppingCenterofHangZhou 30 station westlake 20 ShoppingCenterofHangZhou supermarket 10 xiasha supermarket 50 supermarket westlake 10 -1
50 Hint: The best route is: xiasha->ShoppingCenterofHangZhou->supermarket->westlake 虽然偶尔会迷路,但是因为有了你的帮助 **和**从此还是过上了幸福的生活。 ――全剧终――
嗯,题目大意就是说,还是求两点间的最短路径,但是就是输入不太方便处理,这里我定义一个二维数组放进去,其他的都是一样的
//dijkstra
#include <iostream>
#include<cstdio>
#include<cstring>
#define inf 0x3f3f3f3f
using namespace std;
char s[150][30];
int cnt,map[150][150],rec[150],vis[150];
void dijkstra(int s,int e)
{
memset(vis,0,sizeof(vis));
vis[s]=1;
for(int i=0;i<cnt;++i)
rec[i]=map[s][i];
while(1)
{
int minw=inf,mark=-1;
for(int i=0;i<cnt;++i)
{
if(!vis[i]&&rec[i]<minw)
{
minw=rec[i];
mark=i;
}
}
if(mark==-1)
break;
vis[mark]=1;
for(int i=0;i<cnt;++i)
{
if(!vis[i]&&rec[i]>rec[mark]+map[mark][i])
rec[i]=rec[mark]+map[mark][i];
}
}
if(rec[e]==inf)
printf("-1\n");
else
printf("%d\n",rec[e]);
}
int main()
{
int n,u,v,f;
char a[30],b[30];
while(scanf("%d",&n)&&(n!=-1))
{
memset(map,inf,sizeof(map));
scanf("%s%s",s[0],s[1]);
cnt=2;
while(n--)
{
scanf("%s%s%d",a,b,&f);
for(int i=0;i<cnt;++i)
{
if(strcmp(a,s[i])==0)
{
u=i;
break;
}
else if(i==cnt-1)
{
u=cnt;
strcpy(s[cnt++],a);
break;
}
}
for(int i=0;i<cnt;++i)
{
if(strcmp(b,s[i])==0)
{
v=i;
break;
}
else if(i==cnt-1)
{
v=cnt;
strcpy(s[cnt++],b);
}
}
map[u][v]=map[v][u]=f;
}
if(strcmp(s[0],s[1])==0)
{
printf("0\n");
continue;
}
dijkstra(0,1);
}
return 0;
}
//floyed
#include <iostream>
#include<cstdio>
#include<cstring>
#define inf 0x3f3f3f3f
using namespace std;
char s[150][30];
int cnt,map[150][150];
void floyed()
{
for(int k=0;k<cnt;++k)
{
for(int i=0;i<cnt;++i)
{
for(int j=0;j<cnt;++j)
{
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
}
}
}
int main()
{
int n,u,v,f;
char a[30],b[30];
while(scanf("%d",&n)&&(n!=-1))
{
memset(map,inf,sizeof(map));
scanf("%s%s",s[0],s[1]);
cnt=2;
while(n--)
{
scanf("%s%s%d",a,b,&f);
for(int i=0;i<cnt;++i)
{
if(strcmp(a,s[i])==0)
{
u=i;
break;
}
else if(i==cnt-1)
{
u=cnt;
strcpy(s[cnt++],a);
break;
}
}
for(int i=0;i<cnt;++i)
{
if(strcmp(b,s[i])==0)
{
v=i;
break;
}
else if(i==cnt-1)
{
v=cnt;
strcpy(s[cnt++],b);
}
}
map[u][v]=map[v][u]=f;
}
if(strcmp(s[0],s[1])==0)
{
printf("0\n");
continue;
}
floyed();
if(map[0][1]==inf)
printf("-1\n");
else
printf("%d\n",map[0][1]);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 2112 HDU Today 【最短路径 dijkstra & floyed】
原文地址:http://blog.csdn.net/wyjwyl/article/details/47729841