• 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
  • 相关阅读:
    hdu 4508
    hdu 4506
    hdu 4505
    hdu 1525
    hdu 2212
    (贪心)删数问题
    (最短路 Dijkstra) hdu 1544
    (次小生成树) poj 1679
    (prim)hdu 1102
    (kruskal)hdu 1863
  • 原文地址:https://www.cnblogs.com/daydayupacm/p/5678473.html
Copyright © 2020-2023  润新知