码迷,mamicode.com
首页 > 编程语言 > 详细

hdu 1874 畅通工程续(Floyd算法)

时间:2015-08-21 21:29:53      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:floyd算法

题目来源:[hdu1874](http://acm.hdu.edu.cn/showproblem.php?pid=1874
题目大意:
输入一个n,m,表示有n个城市,编号从1到n,有m条路,每条路输入连接的两个城市编号A,B,及路的长度X,题目说X表示从A到B的双向长度,故应建无向图。然后输入起点S与终点T,求从S到T得最短路径,若不存在,就输出-1。
题目分析:
基础的求最短路径题,使用Floyd算法可求出任意两个顶点间的最短距离,给出起点与终点,将map[S][T]进行输出即可,判断是否起点与终点是否连通也很简单,就看map[S][T]是否等于初始值INF即可,若等,说明不存在到两点的路径。
AC代码:

#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f3f      //定义一个较大的值,用来初始化 
#define MAX 220             //最多有多少点 
int n,m;                    //n代表点数,m代表边数 
int map[MAX][MAX];          //用来存放两点间路径的权值 
void Floyd()                //Floyd算法 
{
    for(int k=0;k<n;k++)
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(map[i][j]>map[i][k]+map[k][j])
                map[i][j]=map[i][k]+map[k][j];
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=0;i<n;i++)    //先将map数组初始化 
        for(int j=0;j<n;j++)
        if(i==j)
            map[i][j]=0;
        else
            map[i][j]=INF;
        for(int i=0;i<m;i++)
        {
            int a,b,d;
            scanf("%d%d%d",&a,&b,&d);
            if(map[a][b]>d)     //存边,并去重 
            {
                map[a][b]=d;
                map[b][a]=d;    //无向图 
            }
        }
        Floyd();
        int s,e;
        scanf("%d%d",&s,&e);
        if(map[s][e]==INF)
            printf("-1\n");
        else
            printf("%d\n",map[s][e]);   //输出起点到终点的最短距离 
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 1874 畅通工程续(Floyd算法)

标签:floyd算法

原文地址:http://blog.csdn.net/lsgbb/article/details/47841693

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!