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

    求最短路,以草儿所在的地方设为0,当做源点,草儿临近的城市到草儿的距离设为0
    这里有一点要注意:并不是1~N的城市都出会出现,所以我用city数组来存储出现过的城市编号,

    如city[i]=1表示 i 出现在数据里,这样就减少不必要的遍历。

    #include <iostream>
    #include <algorithm>
    #include <string.h>
    #include <stdio.h>
    #include <string>
    #include <vector>
    #include <queue>
    
    using namespace std;
    const int maxn=0x3f3f3f3f;
    
    int road[1010][1010];//road[i][j]表示i与j的距离(这里指进过该条路的时间)
    int dis[1010];//dis[i]表示i点到源点1的最短路径大小
    int vis[1010];//vis[i]=1表示节点i已经求过到源点的单源最短路径
    int city[1010];//city[i]=1表示存在该城市,即该城市在数据里出现过
    vector<int> link[1010];//link[i]表示i与哪些点连接
    vector<int> goal;//存储喜欢去的城市。
    int T,S,D;
    int a,b,c,t;
    
    
    struct Node{
        int u,dis;
    
        bool operator<(const Node tmp) const{
            return dis>tmp.dis;  //优先级序列默认的是最先取出的是“最大的”。
        }
        //如果按从小到大排,则优先级队列取最大的。
        //如果从大到小排,则优先级队列取最小的。
    };
    
    void dijkstra(){
        priority_queue<Node> q;
        Node tmp,a;
        memset(dis,maxn,sizeof(dis));
        memset(vis,0,sizeof(vis));
        dis[0]=0;
        city[0]=1;
        a.u=0;
        a.dis=0;
        q.push(a);
        while(!q.empty()){
            tmp=q.top();
            q.pop();
            int idx=tmp.u;
            vis[idx]=1;
            for(int k=0; k<link[idx].size(); k++) {
                int v=link[idx][k];
                if(v!=idx && !vis[v]) {
                    if(dis[idx]+road[idx][v]<dis[v]) {
                        dis[v]=dis[idx]+road[idx][v];
                        a.u=v;
                        a.dis=dis[v];
                        q.push(a);
                    }
                }
            }
        }
    }
    
    int main() {
        while(scanf("%d%d%d",&T,&S,&D)!=EOF) {
            //U.clear();
            memset(road,0,sizeof(road));
            memset(city,0,sizeof(city));
            goal.clear();
            for(int i=0; i<1010; i++)
                link[i].clear();
            for(int i=0; i<T; i++) {
                scanf("%d%d%d",&a,&b,&c);
    
                if(!road[a][b]) {
                    city[a]=1;
                    city[b]=1;
                    road[a][b]=c;
                    road[b][a]=c;
                    link[a].push_back(b);
                    link[b].push_back(a);
                } else if(c<road[a][b]) {
                    road[a][b]=c;
                    road[b][a]=c;
                }
            }
            for(int i=0; i<S; i++) {
                scanf("%d",&t);
                link[0].push_back(t);
            }
            for(int i=0; i<D; i++) {
                scanf("%d",&t);
                goal.push_back(t);
            }
            dijkstra();
            int mintime=maxn;
            for(int i=0; i<D; i++) {
                int v=goal[i];
                mintime=min(mintime,dis[v]);
            }
            printf("%d
    ",mintime);
    
        }
        return 0;
    }


     

  • 相关阅读:
    【转】 url中文乱码问题
    [转]Jquery 点击图片在弹出层显示大图
    JQuery获取和设置Select选项的常用方法总结
    springMVC框架下返回json格式的对象,list,map
    sqlserver数据库 表中字段值有空格,如何去除空格(例如char (5) 存入数据不足5位时sqlserver会自动补空格)
    jquery Jbox 插件实现弹出窗口在修改的数据之后,关闭弹出窗口刷新父页面的问题
    sqlserver 2008 r2 直接下载地址,可用迅雷下载
    web服务器与tomcat
    xml入门与解析
    jdbc框架-dbutils的简单使用
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/3280472.html
Copyright © 2011-2022 走看看