涉及到map容器的使用
使用map
头文件:#include <map> //注意,STL头文件没有扩展名.h
map对象是模板类,需要关键字和存储对象两个模板参数:
map<int,string> number,name;
原题连接http://acm.hdu.edu.cn/showproblem.php?pid=2112
ac代码:
#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
#include <algorithm>
using namespace std;
#define INF 9999999
int k,Map[155][155],d[155],vis[155];
map<string,int>lu,shu;
void set()
{
memset(d,INF,sizeof(d));
for (int i=0; i<155; i++)
{
for (int j=0; j<155; j++)
{
if (i!=j)
Map[i][j]=INF;
else
Map[i][j]=0;
}
}
}
void dijkstra(int m)
{
memset(vis,0,sizeof(vis));
int tm=m;
vis[m]=1;
d[m]=0;
for (int j=1; j<k; j++)
{
int min=INF;
for (int i=0; i<k; i++)
if (!vis[i])
{
if (d[i]>d[tm]+Map[tm][i])
d[i]=d[tm]+Map[tm][i];
if (min>d[i])
{
min=d[i];
m=i;
}
}
vis[m]=1;
tm=m;
}
}
int main()
{
bool flag;
int t,n;
while (scanf("%d",&n),n!=-1)
{
flag=0; //方便输出
lu.clear();
shu.clear();
set();
char start[135],end[135]; //起点终点
char s[135],e[135]; //站名
k=2;
scanf("%s%s",start,end);
if (strcmp(start,end)==0) //起点终点一样;
flag=1;
if(n==0)
{
printf("-1\n");
continue;
}
lu[start]=0;
lu[end]=1;
while (n--)
{
scanf("%s%s%d",s,e,&t);
if(!shu[s]) //map容器的使用
{
shu[s]=1; //标记为1后,若此地点重复出现,不会再进入if
lu[s]=k++;
}
if(!shu[e]) //同理
{
shu[e]=1;
lu[e]=k++;
}
if (Map[lu[s]][lu[e]]>t) //两点不一定只有一个权值,取小的
Map[lu[s]][lu[e]]=Map[lu[e]][lu[s]]=t;
}
if (flag)
{
printf ("0\n");
continue;
}
dijkstra(lu[start]);
if(d[lu[end]]==INF)
printf ("-1\n");
else
printf ("%d\n",d[lu[end]]);
}
return 0;
}