HDU Today HDU - 2112

涉及到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;
}

猜你喜欢

转载自blog.csdn.net/henu_xujiu/article/details/79368394