HDU 2544 最短

链接http://acm.hdu.edu.cn/showproblem.php?

pid=2544

解析

首先数据量为V<=100

那么这里使用不论什么基础的最短路的算法都不会超时!

常见数据

 5 6
 1 2 10
 1 3 4
 2 4 2
 3 4 3
 2 5 5
 4 5 100
// 答案:14 

 2 4
 1 2 10
 1 3 4
 2 4 2
 3 4 3
// 答案:9

Bellman-Ford算法

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
using namespace std;
#define MAX_E 10010
#define MAX_V 105
#define INF 1e8

struct edge{int from, to, cost; };
edge es[2*MAX_E];
int d[MAX_V];
int V, E;

void shortest_path(int s){
    for(int i=1; i<=V; ++i) d[i] = INF;
    d[s] = 0;
    while(true){
        bool update = false;
        for(int i=0; i<2*E; ++i){
            edge e = es[i];
            if(d[e.from] != INF&&d[e.to]>d[e.from]+e.cost){
                d[e.to] = d[e.from] + e.cost;
                update = true;
            }
        }
        if(!update) break;

    }
}

int main(){
    while(~scanf("%d%d", &V, &E), V||E){
        int i;
        int a,b,c;

        for(i=0; i<E; ++i){
            scanf("%d%d%d", &a, &b, &c);
            es[i].from = a; es[i].to = b; es[i].cost = c;
            es[i+E].from = b; es[i+E].to = a; es[i+E].cost = c;
        }
        shortest_path(1);
        printf("%d\n", d[V]);
    }
}

Dijkstra算法

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
#define MAX_V 105
#define MAX_X 105
#define INF 1e8

int cost[MAX_V][MAX_V];
int d[MAX_X];
bool used[MAX_X];
int n,m;

void dijkstra(int s){
    for(int i=1; i<=n; ++i){
        d[i] = INF;
        used[i] = false;
    }
    d[s] = 0;

    while(true){
        int v = -1;
        for(int u=1; u<=n; ++u){
            if(!used[u]&&(v==-1||d[u]<d[v])) v = u;
        }
        if(v == -1) break;
        used[v] = true;
        for(int u=1; u<=n; ++u){
            d[u] = min(d[u], d[v]+cost[v][u]);
        }
    }
}

int main(){
    while(~scanf("%d%d", &n, &m), m||n){
        int i;
        int a,b,c;

        for(i=1; i<=n; ++i)
            for(int j=1; j<=n; ++j)
                cost[i][j] = INF;

        for(i=0; i<m; ++i){
            scanf("%d%d%d", &a, &b, &c);
            cost[a][b] = c;
            cost[b][a] = c;
        }
        dijkstra(1);
        printf("%d\n", d[n]);
    }
}

Floyd算法

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
using namespace std;
#define MAX_V 105
#define MAX_X 105
#define INF 1e8

int d[MAX_V][MAX_V];
bool used[MAX_X];
int n,m;

void floyd(){
    for(int k=1; k<=n; ++k){
        for(int i=1; i<=n; ++i){
            for(int j=1; j<=n; ++j){
                d[i][j] = min(d[i][j], d[i][k]+d[k][j]);
            }
        }
    }
}

int main(){
    while(~scanf("%d%d", &n, &m), m||n){
        int i;
        int a,b,c;

        for(i=1; i<=n; ++i)
            for(int j=1; j<=n; ++j)
                d[i][j] = INF;
        for(i=1; i<=n; ++i) d[i][i] = 0;

        for(i=0; i<m; ++i){
            scanf("%d%d%d", &a, &b, &c);
            d[a][b] = c;
            d[b][a] = c;
        }
        floyd();
        printf("%d\n", d[1][n]);
    }
}

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2024-08-11 03:28:01

HDU 2544 最短的相关文章

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<

HDU 2544:最短路( 最短路径入门 &amp;&amp;Dijkstra &amp;&amp; floyd )

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 30972    Accepted Submission(s): 13345 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

HDU 2544 最短路(我的dijkstra算法模板、SPAFA算法模板)

思路:这道题是基础的最短路径算法,可以拿来试一下自己对3种方法的理解 dijkstra主要是从第一个点开始枚举,每次枚举出当当前最小的路径,然后再以那最小的路径点为起点,求出它到其它未标记点的最短距离 bellman-ford 算法则是假设有向网中有n 个顶点.且不存在负权值回路,从顶点v1 和到顶点v2 如果存在最短路径,则此路径最多有n-1 条边.这是因为如果路径上的边数超过了n-1 条时,必然会重复经过一个顶点,形成回路:而如果这个回路的权值总和为非负时,完全可以去掉这个回路,使得v1到v

最短路 (HDU 2544)

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28836    Accepted Submission(s): 12480 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

hdu 2544 单源最短路问题 dijkstra+堆优化模板

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 41168    Accepted Submission(s): 17992 Problem Description 在每年的校赛里.全部进入决赛的同学都会获得一件非常美丽的t-shirt.可是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的.所以如今他们想要寻

hdu 2544 hdu 1874 Dijkstra 模板题

hdu 2544  求点1到点n的最短路 Sample Input2 1 //结点数 边数1 2 3 //u v w3 31 2 52 3 53 1 20 0 Sample Output32 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath> 6 # define LL long

hdu 2544 最短路 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目意思:给出 n 个路口和 m 条路,每一条路需要 c 分钟走过.问从路口 1 到路口 n 需要的最短时间是多少. 这题是最短路的入门题,从理解d-i--j---k(wg自创的,呵呵)到默打到修改,搞左两日终于好了,哈哈哈~~~太感动了. 第一次错是 少了Dijkstra()函数中的 for (j = 1; j <= n; j++) . 第二次错是把vis[k=j]=1 写在了 if (!v

HDU 2544 最短路 (最短路)

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 31955    Accepted Submission(s): 13845 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最

hdu 2544 最短路 (dijkstra,floyd)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目大意:找到两点间最短的距离值. 代码一:(dijkstra算法) 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int n,Min,node[105],visit[105],map[105][105]; 5 void set() 6 { 7 for (int i=1; i<=n; i