hdu 2544 最短路

点击打开链接hdu2544

思路:  模板题,求解最短路的四种算法都可以。注意求解最短路时候要处理成无向图

代码:

/*Dijkstra*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 110
#define INF 0xFFFFFFF

int n , m;
int  value[MAXN][MAXN];
int  dis[MAXN];

void Dijkstra(){
     int pos;
     int vis[MAXN];
     memset(vis , 0 , sizeof(vis));
     dis[1] = 0;
     for(int i = 2 ; i <= n ; i++)
        dis[i] = INF;
     for(int i = 1 ; i <= n ; i++){
         pos = -1;
         for(int j = 1 ; j <= n ; j++){
            if(!vis[j] && (pos == -1 || dis[j] < dis[pos]))
               pos = j;
         }
         vis[pos] = 1;
         for(int j = 1 ; j <= n ; j++){
            if(!vis[j] && dis[j] > dis[pos] + value[pos][j])
               dis[j] = dis[pos] + value[pos][j];
         }
     }
     printf("%d\n" , dis[n]);
}

int main(){
    //freopen("input.txt" , "r" , stdin);
    int star , end , v;
    while(scanf("%d%d" , &n , &m) , n+m){
       for(int i = 1 ; i <= n ; i++){
          for(int j = 1 ; j <= n ; j++)
             value[i][j] = INF;
       }
       for(int i = 0 ; i < m ; i++){
          scanf("%d%d%d" , &star , &end , &v);
          if(value[star][end] != INF)
            value[star][end] = value[end][star] = v;
          else{
            if(value[star][end] > v)
               value[star][end] = value[end][star] = v;
          }
       }
       Dijkstra();
    }
    return 0;
}

/*floyd*/
/*floyd*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 110
#define INF 0xFFFFFFF

int n , m;
long long dis[MAXN][MAXN];

void init(){
    for(int i = 1 ; i <= n ; i++){
       for(int j = 1 ; j <= n ; j++){
          if(i == j)
            dis[i][j] = 0;
          else
            dis[i][j] = INF;
       }
    }
}

long long min(int a , int b){
     return a < b ? a : b;
}

void floyd(){
     for(int k = 1 ; k <= n ; k++){
       for(int i = 1 ; i <= n ; i++){
          for(int j = 1 ; j <= n ; j++)
             dis[i][j] = min(dis[i][k]+ dis[k][j] , dis[i][j]);
       }
     }
     printf("%lld\n" , dis[1][n]);
}

int main(){
    //freopen("input.txt" , "r" , stdin);
    int a , b , value;
    while(scanf("%d%d" , &n , &m) , n+m){
         init();
         for(int i = 0 ; i < m ; i++){
            scanf("%d%d%d" , &a , &b , &value);
            dis[a][b] = dis[b][a] = value;
         }
         floyd();
    }
    return 0;
}

/*Bellman_Ford*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 20010
#define INF 0xFFFFFFF

int n , m;
long long dis[MAXN];
struct Edge{
   int x;
   int y;
   int value;
}e[MAXN];

void Bellman_Ford(){
     dis[1] = 0;
     for(int i = 2 ; i <= n ; i++)
        dis[i] = INF;
     for(int i = 1 ; i < n ; i++){
       for(int j = 0 ; j < 2*m ; j++){
          if(dis[e[j].y] > dis[e[j].x] + e[j].value)
            dis[e[j].y] = dis[e[j].x] + e[j].value;
       }
     }
     printf("%lld\n" , dis[n]);
}

int main(){
    //freopen("input.txt" , "r" , stdin);
    while(scanf("%d%d", &n , &m) , n+m){
        for(int i = 0 ; i < m ; i++){
           scanf("%d%d%d" , &e[i].x , &e[i].y , &e[i].value);
           e[i+m].x = e[i].y;
           e[i+m].y = e[i].x;
           e[i+m].value= e[i].value;
        }
        Bellman_Ford();
    }
    return 0;
}

/*SPFA*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define MAXN 20010
#define INF 0xFFFFFFF

int n , m;
int first[MAXN] , next[MAXN];
int star[MAXN] , end[MAXN] , value[MAXN];
int dis[MAXN];
int vis[MAXN];
queue<int>q;

void init(){
    memset(first , -1 , sizeof(first));
    memset(next , -1 , sizeof(next));
    memset(vis , 0 , sizeof(vis));
}

void SPFA(){
    dis[1] = 0;
    for(int i = 2 ; i <= n ; i++)
       dis[i] = INF;
    vis[1] = 1;
    while(!q.empty())
       q.pop();
    q.push(1);
    while(!q.empty()){
        int tmp = q.front();
        q.pop();
        vis[tmp] = 0;
        for(int i = first[tmp] ; i != -1 ; i = next[i]){
           if(dis[end[i]] > dis[tmp] + value[i]){
              dis[end[i]] = dis[tmp ] + value[i];
              if(!vis[end[i]]){
                 vis[end[i]] = 1;
                 q.push(end[i]);
              }
           }
        }
    }
    printf("%d\n" , dis[n]);
}

int main(){
    //freopen("input.txt" , "r" , stdin);
    while(scanf("%d%d" , &n , &m) , n+m){
        init();
        /*处理成无向图*/
        for(int i = 0 ; i < m ;i++){
           scanf("%d%d%d" , &star[i] , &end[i] , &value[i]);
           star[i+m] = end[i];
           end[i+m] = star[i];
           value[i+m] = value[i];

           next[i] = first[star[i]];
           first[star[i]] = i;
           next[i+m] = first[star[i+m]];
           first[star[i+m]] = i+m;
        }
        SPFA();
    }
    return 0;
}
时间: 2024-09-15 16:34:26

hdu 2544 最短路的相关文章

HDU 2544最短路:各种最短路算法的实现

链接: http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目: Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路

最短路专题【完结】

第一题 hdu 1317 XYZZY 点击打开hdu 1317 思路: 1 题目的图是一个有向图,并且可能存在环.第一个点的能量值为100,边的权值利用能量大小,例如2点为-60,如果1->2那么value[1][2] = -602 题目明确指出如果是要win的话,那么必须是经过的每条边都要大于0.那么我们只要把那些经过松弛操作后的点大于0的入队即可,小于等于0的点肯定不会出现在最终的路径上.3 如果存在正环的话,那么就有能量值无限大,那么这个时候只要判断这个点能否到达n4 判断是否是有环还是五

HDU-3751 找最短路必经点,超时了

问题描述 HDU-3751 找最短路必经点,超时了 代码:代码 我的思路:先存这个图上从小偷家到各点的最短时间在d1数组,存警察到图上各点最短时间在d2数组, 然后遍历小偷以最短路回家可能经过的位置,这个位置是不是一定经过,然后求出最小时间 解决方案 http://blog.csdn.net/u012774187/article/details/41734977 解决方案二: 最短路 (HDU 2544)hdu 5137 最短路最大化

Dijkstra算法 c语言实现

 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低. Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等. 其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合.一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知. 初始时,

HDU 1535 Invitation Cards:多源点到单点最短路

链接: http://acm.hdu.edu.cn/showproblem.php?pid=1535 题目: Invitation Cards Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1044    Accepted Submission(s): 459 Problem Description In the age of te

HDU 3339 In Action:最短路+背包

链接: http://acm.hdu.edu.cn/showproblem.php?pid=3339 题目: Problem Description Since 1945, when the first nuclear bomb was exploded by the Manhattan Project team in the US, the number of nuclear weapons have soared across the globe. Nowadays,the crazy bo

HDU 1595 find the longest of the shortest(枚举,最短路)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=1595 题目: find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 667    Accepted Submission(s): 220 Problem Description Ma

HDU 1385 Minimum Transport Cost:最短路,打印字典序路径

链接: http://acm.hdu.edu.cn/showproblem.php?pid=1385 题目大意: 有N个城市,然后直接给出这些城市之间的邻接矩阵,矩阵中-1代表那两个城市无道路相连,其他值代表路径长度. 如果一辆汽车经过某个城市,必须要交一定的钱(可能是过路费). 现在要从a城到b城,花费为路径长度之和,再加上除起点与终点外所有城市的过路费之和. 求最小花费,如果有多条路经符合,则输出字典序最小的路径. 分析与总结: 1.   这题的关键在于按照字典序输出路径. 假设有 1---

HDU 2962 Trucking:二分+带限制最短路

链接: http://acm.hdu.edu.cn/showproblem.php?pid=2962 题目: Trucking Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1211    Accepted Submission(s): 428 Problem Description A certain local truckin