zoukankan      html  css  js  c++  java
  • Hdu 2066 一个人的旅行

    Problem地址 : http://acm.hdu.edu.cn/showproblem.php?pid=2066

    这道题可以使用最短路解题,因此可以使用Dijstra算法。

    因为存在几个与家相连的地方,假设这个地方叫A,那我们可以设想家到A的距离为0,那此题就变成从A到目的地,变成从家到目的地。因为A的数量是不定的,但家就只有一个,所以采用这种措施可以简化题目。

    另外此题中提供的路径,比如A到B,是可以有多条的,因此,A到B之间需要采取最短的那条。

    题目中给出了几个主人公想去的地方,仔细想一下或许可以想到,这几个地方中可能存在几个到达不了的地方,这些不能到达的地方的存在可能会影响我们的判断,因此需要注意。

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <queue>
    
    using namespace std;
    
    const int MAXN = 1000 + 50;
    const int INF = 65535;
    const int HOME = 0; // 起点
    int dis[MAXN][MAXN]; // 两点之间的距离
    int path[MAXN]; // 家到任意一点的距离
    int vis[ MAXN ]; // 是否访问了该点
    int roads, T, S, D; // roads表示地点的最大编号
    
    void ReadRoads() {
        memset( dis, -1, sizeof( dis ) );
        roads = -INF;
        int a, b, s;
        while( T -- ) {
            scanf( "%d%d%d", &a, &b, &s );
            if( dis[a][b]!=-1 && dis[a][b] < s ) {
                continue;
            }
            dis[a][b] = dis[b][a] = s;
            roads = roads > a ? roads : a;
            roads = roads > b ? roads : b;
        }
        while( S -- ) {
            scanf( "%d", &a );
            dis[HOME][a] = dis[a][HOME] = 0;
        }
    }
    
    void Dijstra() {
        memset( vis, false, sizeof( vis ) );
        memset( path, 0, sizeof( path ) );
        vis[0] = true;
        queue <int> q;
        q.push( HOME );
        int t, i;
        while( !q.empty() ) {
            t = q.front();
            q.pop();
            for( i=0; i<=roads; i++ ) {
                if( dis[ t ][ i ] != -1 ) {
                    if( vis[i] ) {
                        path[i] = path[t]+dis[t][i] < path[i] ? path[t]+dis[t][i] : path[i];
                    } else {
                        path[i] = path[t] + dis[t][i];
                        vis[i] = true;
                        q.push( i );
                    }
                }
            }
        }
    }
    
    int GetMin() {
        int minC = INF;
        int tmpPos;
        while( D-- ) {
            scanf( "%d", &tmpPos );
            if( !vis[ tmpPos ] ) { // 存在不能到达的城市
                continue;
            }
            minC = minC < path[tmpPos] ? minC : path[ tmpPos ];
        }
        return minC;
    }
    
    int main()
    {
        while( scanf( "%d%d%d", &T, &S, &D ) != EOF ) {
            ReadRoads();
            Dijkstra();
            printf( "%d
    ", GetMin() );
        }
        return 0;
    }
    
  • 相关阅读:
    关于C#调用VC SDK小结
    失业日志:2009年10月15日 猫 老鼠 人(一)
    闲聊日志 一:
    按编号分类的树
    不知不觉又用到了VC6
    这个问题很郁闷.net mvc,也可能我不知道
    失业日志:2008年10月13日
    失业日志:2009年10月16日 能回忆多少就写多少
    失业日志:2009年10月12日星期一
    失业日志 200910月22日
  • 原文地址:https://www.cnblogs.com/Emerald/p/4385262.html
Copyright © 2011-2022 走看看