Dijkstra+stl_map
map的简单用法可以直接看下面的代码了解下
做最短路的题要注意更新数据,之前在地图net[][]的更新上没注意,每次拿到数据就更新(实际应该先判断是否比之前的net[i][j]要小)
注意起点和终点重合的情况
#include<cstring>
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
#define MAX 155
#define inf 0x3f3f3f3f
map<string,int>M;
int net[MAX][MAX],d[MAX],v[MAX];
int s,e;
void djs(int lenth)
{
int i,j,index,min;
memset(d,0,sizeof(d));
memset(v,0,sizeof(v));
for(i=1;i<lenth;i++)
{
d[i]=net[s][i];
}
d[s]=0;
v[s]=1;
for(i=1;i<lenth-1;i++)
{
min=inf;
index=0;
for(j=1;j<lenth;j++)
{
if(v[j]==0&&d[j]<min)
{
min=d[j];
index=j;
}
}
if(index==0)
{
break;
}
v[index]=1;
for(j=1;j<lenth;j++)
{
if(v[j]==0&&d[index]+net[index][j]<d[j])
d[j]=d[index]+net[index][j];
}
}
if(d[e]<inf)
printf("%d\n",d[e]);
else
printf("-1\n");
}
int main()
{
int i,j,l,n;
int count;
char a[35],b[35];
while(scanf("%d",&n)!=EOF)
{
if(n==-1)
return 0;
M.clear();
count=1;
for(i=1;i<MAX;i++)
for(j=1;j<MAX;j++)
{
net[i][j]=net[j][i]=inf;
if(i==j)
net[i][j]=net[j][i]=0;
}
scanf("%s %s",a,b);
s=M[a]=count++;
if(M[b]==0)//根据起点和终点是否重合做相应处理
e=M[b]=count++;
else
e=s;
while(n--)
{
scanf("%s %s %d",a,b,&l);
if(M[a]==0)
M[a]=count++;
if(M[b]==0)
M[b]=count++;
if(net[M[a]][M[b]]>l)
net[M[a]][M[b]]=net[M[b]][M[a]]=l;
}
djs(count);//把城市个数(城市个数其实是count-1个)
}
return 0;
}