zoukankan      html  css  js  c++  java
  • HDU

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544

    #include <iostream>
    #include <string.h>
    #define MAX 10000005
    #define N 10005
    using namespace std;
    /****************************************************************************************************************
                    题意:找到规定起点终点的单源最短路经
                    思路:
                    1,dijkstra算法,看到一个大牛的blog,一张表格让我顿悟了
                    2,dijkstra可以解决又向无向图,无向图给边赋较小的权值,有向图权值为1
                    3,切记dijkstra不能解决负权图
    ****************************************************************************************************************/
    
    int visit[N];       //用来判断是非在特殊路径集合点内
    int dist[N];
    int a[N][N];
    int dijkstra(int n)
    {
        for(int i = 1;i <= n;i ++)
            dist[i]=a[1][i];
        memset(visit,0,sizeof(visit));
    
        dist[1]=0;
        visit[1]=1;
    
        for(int i = 2;i <= n;i ++){
            int id=1,ansN=MAX;
            for(int j = 2;j <= n;j ++){
                if(!visit[j] && dist[j] < ansN){        //在S集合外找出最小路径点(即非特殊路径)
                    ansN=dist[j];
                    id=j;
                }
            }
            visit[id]=1;
            for(int j = 2;j <= n;j ++){     //以找到的最小路径点为最优解进行动态更新(非特殊路径集合点内遍历)
                if(!visit[j] && a[id][j] < MAX)
                    dist[j]=min(dist[j],dist[id]+a[id][j]);
            }
        }
    }
    int main()
    {
        int n,m;
        while(cin>>n>>m)
        {
            if(n == 0 && m == 0)    break;
            for(int i = 1;i <= n;i ++){
                for(int j = 1;j <= n;j ++)
                    a[i][j]=MAX;
                dist[i]=MAX;
            }
            //memset(dist,MAX,sizeof(dist));
    
            int tempa,tempb,tempc;
            for(int i = 1;i <= m;i ++){
                cin>>tempa>>tempb>>tempc;
                if(tempc < a[tempa][tempb]){        //无向图,保存两次
                    a[tempa][tempb]=tempc;
                    a[tempb][tempa]=tempc;
                }
            }
    
            dijkstra(n);
            cout<<dist[n]<<endl;
        }
        return 0;
    }
    



  • 相关阅读:
    delphi Int64Rec 应用实例
    PerformEraseBackground 擦除背景(ThemeServices)
    Delphi 的 Bit
    delphi 关于 "高位" 与 "低位"
    PByte和PChar的关系
    执行控制台程序并且获得它的输出结果
    Console下Pause效果的函数
    ByteType字符串中判断是否英文
    窗体包括标题作为一个位图复制到剪贴板
    inf 启动
  • 原文地址:https://www.cnblogs.com/Jstyle-continue/p/6351993.html
Copyright © 2011-2022 走看看