hdu 1874 畅通工程续(最短路径)

题意:最短路径

思路:最短路径模板

1.单源最短路径(dijkstra)

#include<iostream>
#include<stdio.h>
using namespace std;

#define MAXN 1010
#define typec int
#define INF 0x3f3f3f3f//防止后面溢出,这个不能太大
bool vis[MAXN];
int pre[MAXN];
int cost[MAXN][MAXN],lowcost[MAXN];

void dijkstra(typec cost[][MAXN],typec lowcost[],int n,int beg){//beg为源点
    int i,j,k,Min;
    for(i=0;i<n;++i){
        lowcost[i]=INF;vis[i]=false;pre[i]=-1;
    }
    lowcost[beg]=0;
    for(j=0;j<n;++j){
        k=-1;
        Min=INF;
        for(i=0;i<n;++i)
            if(!vis[i]&&lowcost[i]<Min){
                Min=lowcost[i];
                k=i;
            }
        if(k==-1)break;
        vis[k]=true;
        for(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 main(){
    int n,m;//点数,边数
    int a,b,w,i,j;
    int s,t;//起点,终点

    while(~scanf("%d%d",&n,&m)){
        for(i=0;i<n;++i)
            for(j=0;j<n;++j)
                cost[i][j]=INF;
        for(i=0;i<m;++i){
            scanf("%d%d%d",&a,&b,&w);
            if(w<cost[a][b])cost[a][b]=cost[b][a]=w;//
        }
        scanf("%d%d",&s,&t);
        dijkstra(cost,lowcost,n,s);
        if(lowcost[t]!=INF)printf("%d\n",lowcost[t]);
        else printf("-1\n");
    }
    return 0;
}

2.多源最短路径(floyd)

#include<iostream>
#include<stdio.h>
using namespace std;

#define MAXN 1010
#define typec int
#define INF 0x3f3f3f3f//防止后面溢出,这个不能太大
int path[MAXN][MAXN];
int cost[MAXN][MAXN],lowcost[MAXN][MAXN];

void floyd(typec cost[][MAXN],typec lowcost[][MAXN],int n){
    int i,j,k;
    for(i=0;i<n;++i)
        for(j=0;j<n;++j){
            lowcost[i][j]=cost[i][j];
            if(i!=j&&cost[i][j]<INF)path[i][j]=i;
            else path[i][j]=-1;
        }
    for(k=0;k<n;++k)
        for(i=0;i<n;++i)
            for(j=0;j<n;++j)
                if(lowcost[i][k]+lowcost[k][j]<lowcost[i][j]){
                    lowcost[i][j]=lowcost[i][k]+lowcost[k][j];
                    path[i][j]=path[k][j];
                }
}

int main(){
    int n,m;//点数,边数
    int a,b,w,i,j;
    int s,t;//起点,终点

    while(~scanf("%d%d",&n,&m)){
        for(i=0;i<n;++i)
            for(j=0;j<n;++j)
                cost[i][j]=INF;
        for(i=0;i<m;++i){
            scanf("%d%d%d",&a,&b,&w);
            if(w<cost[a][b])cost[a][b]=cost[b][a]=w;//
        }
        scanf("%d%d",&s,&t);
        floyd(cost,lowcost,n);
        if(s==t)printf("0\n");
        else if(lowcost[s][t]!=INF)printf("%d\n",lowcost[s][t]);
        else printf("-1\n");
    }
    return 0;
}

时间: 2024-10-14 03:58:21

hdu 1874 畅通工程续(最短路径)的相关文章

HDU 1874 畅通工程续 (最短路径)

畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 26735    Accepted Submission(s): 9625 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走

HDU 1874 畅通工程续 最短路径入门(dijkstra)

Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input 本题目包含多组数据,请处理到文件结束. 每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目.城镇分别以

ACM: HDU 1874 畅通工程续-Dijkstra算法

HDU 1874 畅通工程续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input 本题目包含多

【floyd】HDU 1874 畅通工程续

之后的题解偏重实用/总结性质,尽量理解算法本身而不是题,时间复杂度什么的也可以放放. 很久之前做过这个题,当时使用dijkstra做的,关于几个最短路算法,分类的话可以分为以下几种. 1.单源最短路:已知起点(终点),计算从源点到其他各个顶点的最短路径长度. 典型算法:Dijkstra,Bellman-Ford(可以算负的,比较慢),spfa(负权能用,加了松弛操作,速度比较炸天) 2.全局最短路:从一点到另一点,典型如Floyd,A*启发式算法. 重新用floyd写一遍: #include <

【裸单源最短路:Dijkstra算法两种版本】hdu 1874 畅通工程续

Source : hdu 1874 畅通工程续 http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input 本题目包含多组数据,请处理到文件结束.

HDU - 1232 畅通工程 HDU - 1874畅通工程续 HDU - 1875畅通工程再续

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1232 题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1875 畅通工程属于水题,直接用并查集就行,加个路径压缩那就更好. 畅通工程续这道题WA了N次,因为有一个地方没注意到就是一个城镇到另外一个城镇的有多条道路, 所以你一开始就要把最短的道路选出来.

hdu 1874 畅通工程续 Dijkstra

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目分析:输入起点和终点,顶点的个数,已连通的边. 输出起点到终点的最短路径,若不存在,输出-1. 注意事项:1.可能有多条路径  2.要判断不存在连通路径的情况 /*畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 31092

HDU 1874 畅通工程续【Floyd算法实现】

畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 53806    Accepted Submission(s): 20092 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走

hdu 1874 畅通工程续 (裸的 Dijkstra)

畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 36056    Accepted Submission(s): 13238 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行

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

题目链接:hdu-1874 畅通工程续 畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 37414 Accepted Submission(s): 13812 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择