这题我用Dijkstra算法的时间花费为562MS
Floyd算法的时间花费为921MS ,险过
Floyd代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<limits.h>
using namespace std;
#define INF 0xffffff
__int64 map[200][200];
char s[200][50];//地名
__int64 d[200][200];//i到j最短路
void Floyd(int n)
{
for(int i= 1; i<= n; i++)
for(int j= 1; j<= n; j++)
d[i][j]= map[i][j];
for(int u= 1; u<= n; u++)
for(int v= 1; v<= n; v++)
for(int w= 1; w<= n; w++)
if(d[u][v] + d[u][w] < d[v][w])
d[v][w]= d[u][v] + d[u][w];
}
int Find(int &sum,char *ch)
{
for(int i= 1; i<= sum; i++)
if(!strcmp(s[i],ch))
return i;
sum++;
strcpy(s[sum],ch);
return sum;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n!=-1)
{
for(int i= 1; i<= 180; i++)
for(int j= 1; j<= 180; j++)
{
if(i==j)
map[i][j]= 0;
else
map[i][j]= INF;
}
int sum= 0;//车站的数目
char ch1[50],ch2[50];// 起点站,终点站
int be,end; //起点站,终点站的编号
scanf("%s %s",&ch1,&ch2);
char s1[50],s2[50];
for(int i= 1; i<= n; i++)
{
int a,b,c;
scanf("%s %s %d",&s1,&s2,&c);
a= Find(sum,s1);
b= Find(sum,s2);
if(c< map[a][b])
map[a][b]= map[b][a]= c;
}
be= Find(sum,ch1);
end= Find(sum,ch2);
Floyd(sum);
if(d[be][end]>= INF)
printf("-1\n");
else
printf("%I64d\n",d[be][end]);
}
return 0;
}
Dijkstra代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<limits.h>
using namespace std;
#define INF 0xffffff
__int64 map[200][200];
__int64 dis[200];
int vis[200];
char s[200][50];
void Dijkstra(int sum,int be)
{
for(int i= 1; i<= 150; i++)
dis[i]= map[be][i];
memset(vis,0,sizeof(vis));
vis[be]= 1;
dis[be]= 0;
int pre;
for(int t= 1; t<= sum; t++)
{
int min= INF+ 1;
for(int i= 1; i<= sum; i++)
if(!vis[i]&&dis[i]< min)
{
min= dis[i];
pre= i;
}
vis[pre]= 1;
for(int i= 1; i<= sum; i++)
if(!vis[i]&&dis[i]> dis[pre] + map[pre][i])
dis[i]= dis[pre] + map[pre][i];
}
}
int Find(int &sum,char *ch)
{
for(int i= 1; i<= sum; i++)
if(!strcmp(s[i],ch))
return i;
sum++;
strcpy(s[sum],ch);
return sum;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n!=-1)
{
for(int i= 1; i<= 180; i++)
for(int j= 1; j<= 180; j++)
{
if(i==j)
map[i][j]= 0;
else
map[i][j]= INF;
}
int sum= 0;//车站的数目
char ch1[50],ch2[50];// 起点站,终点站
int be,end; //起点站,终点站的编号
scanf("%s %s",&ch1,&ch2);
char s1[50],s2[50];
for(int i= 1; i<= n; i++)
{
int a,b,c;
scanf("%s %s %d",&s1,&s2,&c);
a= Find(sum,s1);
b= Find(sum,s2);
if(c< map[a][b])
map[a][b]= map[b][a]= c;
}
be= Find(sum,ch1);
end= Find(sum,ch2);
Dijkstra(sum,be);
if(dis[end]>= INF)
printf("-1\n");
else
printf("%I64d\n",dis[end]);
}
return 0;
}