HDU Today HDU 2112

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112

题意:给你各个站到各个站的距离,问你起点到终点的最短距离。(最短路)

     难处理的地方在于给出的是字符串,而平常我们都是用数字做的,所以我们需把字符串都变成相对应的数字,那么问题就迎刃而解了。

 ////如果给出起点和终点位置一样,那么则直接输出 0 就OK了。。。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <map>
#include <stack>
#include <cstring>
using namespace std;
#define INF 0xfffffff
#define maxn 200
int maps[maxn][maxn], v[500], dist[500];

void Init()
{
    int i, j;

    for(i=0; i<=155; i++)
    for(j=0; j<=155; j++)
    if(i==j) maps[i][j]=0;
    else maps[i][j]=maps[j][i]=INF;
}

int Dij(int n)
{
    int i, j;

    memset(v, 0, sizeof(v));

    for(i=1; i<=n; i++)
        dist[i] = maps[1][i];

    v[1] = 1;

    for(i=1; i<n; i++)
    {
        int mins = INF, index;

        for(j=1; j<=n; j++)
        {
            if(!v[j] && dist[j] < mins)
            {
                mins = dist[j];
                index = j;
            }
        }

        v[index] = 1;

        for(j=1; j<=n; j++)
        {
            if(!v[j] && mins+maps[index][j] < dist[j])
                dist[j] = mins + maps[index][j];
        }
    }

    return dist[2];
}

int main()
{
    int  p, n, flag;

    while(scanf("%d", &n), n!=-1)
    {
        char a[60], b[60];
        flag = 0;
        map<string, int> s;
        s.clear();

        Init();

        scanf("%s %s", a, b);
        s[a] = 1;
        s[b] = 2;

        if(strcmp(a, b) == 0)
            flag = 1;


        int cnt = 3;

        while(n --)
        {
            scanf("%s %s %d",a, b, &p);
            if(!s[a]) s[a] = cnt++;
            if(!s[b]) s[b] = cnt++;

            maps[s[a]][s[b]] = maps[s[b]][s[a]] = min(maps[s[b]][s[a]], p);
        }

         if(flag)
         {
             printf("0
");
             continue;
         }
         int ans = Dij(cnt-1);

         if(ans == INF) ans = -1;

         printf("%d
", ans);

    }
}
View Code
原文地址:https://www.cnblogs.com/daydayupacm/p/5678473.html