首页 > 其他 > 详细

HDU - 2066 一个人的旅行(最短路径)

时间:2015-12-03 17:06:04      阅读:337      评论:0      收藏:0      [点我收藏+]

d.

d.

c.Dijkstra单源最短路

技术分享
/*
Dijkstra单源最短路
权值必须是非负
单源最短路径,Dijkstra算法,邻接矩阵形式,复杂度为O(n^2)
求出源beg到所有点的最短路径,传入图的顶点数,和邻接矩阵cost[][]
返回各点的最短路径lowcost[],路径pre[].pre[i]记录beg到i路径上的父结点,pre[beg]=-1
可更改路径权类型,但是权值必须为非负
*/
#include<iostream>
#include<stdio.h>
using namespace std;

const int MAXN=1010;
#define typec int
const typec INF=0x3f3f3f3f;//防止后面溢出,这个不能太大
bool vis[MAXN];
int pre[MAXN];
void Dijkstra(typec cost[][MAXN],typec lowcost[],int n,int beg){
    for(int i=0;i<n;i++){
        lowcost[i]=INF;vis[i]=false;pre[i]=-1;
    }
    lowcost[beg]=0;
    for(int j=0;j<n;j++){
        int k=-1;
        int Min=INF;
        for(int i=0;i<n;i++)
            if(!vis[i]&&lowcost[i]<Min){
                Min=lowcost[i];
                k=i;
            }
        if(k==-1)break;
        vis[k]=true;
        for(int i=0;i<n;i++)
            if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i]){
                lowcost[i]=lowcost[k]+cost[k][i];
                pre[i]=k;
            }
    }
}

int cost[MAXN][MAXN];
int lowcost[MAXN];

int main(){

    int T,S,D;
    int a,b,time;
    int city1[MAXN];
    int city2[MAXN];

    while(~scanf("%d%d%d",&T,&S,&D)){
        for(int i=0;i<MAXN;++i){
            for(int j=0;j<MAXN;++j){
                cost[i][j]=INF;
            }
        }

        for(int i=0;i<T;++i){
            scanf("%d%d%d",&a,&b,&time);
            if(time<cost[a][b]){
                cost[a][b]=time;
                cost[b][a]=time;
            }
        }
        //0作为草儿家
        for(int i=0;i<S;++i){
            scanf("%d",&city1[i]);
            cost[0][city1[i]]=0;
            cost[city1[i]][0]=1;
        }
        for(int i=0;i<D;++i){
            scanf("%d",&city2[i]);
        }

        Dijkstra(cost,lowcost,MAXN,0);
        int minTime=lowcost[city2[0]];
        for(int i=1;i<D;++i){
            if(lowcost[city2[i]]<minTime)
                minTime=lowcost[city2[i]];
        }

        printf("%d\n",minTime);
    }
    return 0;
}
View Code

 

c2.Dijkstra算法+堆优化

c3.单源最短路bellman_ford算法

c4.单源最短路SPFA

HDU - 2066 一个人的旅行(最短路径)

原文:http://www.cnblogs.com/bofengyu/p/5016870.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!