• hdu 1874 畅通工程续 最短路 DIS 和 FLOYD


    disjkstra 算法
    View Code
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
    int map[205][205];
    void inint(int n)
    {
        int i,j;
        for(i = 0;i < n;i++)
        for(j = 0;j < n;j++)
        if(i != j)
        map[i][j] = 0x5fffffff;
        else
        map[i][j] = 0;
    }//初始化~
    void Dijkstra(int s,int t,int n)
    {
        int vis[205] = {0};
        int i,j,val[205],pre;
        vis[s] = 1;
        for(i = 0;i < n;i++)
        val[i] = map[s][i];//初始化(感觉跟prim一样的套路= =)
        pre = s;
        int min = 0x5fffffff;
        for(i = 1;i < n;i++)//循环N-1次
        {
            min = 0x5fffffff;
            for(j = 0;j < n;j++)
            {
                if(!vis[j] && map[pre][j] != 0x5ffffff && val[j] > map[pre][j]+val[pre])//找出可以更新的值
                val[j] = val[pre] + map[pre][j];
            }
            for(j = 0;j < n;j++)
            if(min > val[j] && !vis[j])//找出最短的那一条~
            min = val[j],pre = j;
            vis[pre] = 1;
        }
        if(val[t] == 0x5fffffff)//表明不可达,,,
        printf("-1\n");
        else
        printf("%d\n",val[t]);//可达~
    }
    int main()
    {
        int n,m,i,j,s,t,a,b,w;
        while(~scanf("%d %d",&m,&n))
        {
            inint(m);
            for(i = 0;i < n;i++)
            {
                scanf("%d %d %d",&a,&b,&w);
                if(w < map[a][b])
                map[a][b] = map[b][a] =  w;
            }
            scanf("%d %d",&s,&t);
            Dijkstra(s,t,m);
        }
        return 0;
    }

    floyd算法

    View Code
     1 #include <stdio.h>
     2 #include <string.h>
     3 #define max 10000*100+1
     4 int map[205][205];
     5 void inint(int n)
     6 {
     7     int i,j;
     8     for(i = 0;i < n;i++)
     9     for(j = 0;j < n;j++)
    10     if(i == j)
    11     map[i][j] = 0;
    12     else
    13     map[i][j] = max;
    14 }
    15 int floyd(int n,int s,int t)
    16 {
    17     int val[205][205];
    18     int i,j,k;
    19     for(i = 0;i < n;i++)
    20     for(j = 0;j < n;j++)
    21     val[i][j] = map[i][j];
    22     for(k = 0;k < n;k++)//循环n次
    23     {
    24         for(i = 0;i < n;i++)
    25         {
    26             for(j = 0;j < n;j++)
    27             {
    28                 if(val[i][j] > val[i][k]+val[k][j])
    29                 val[i][j] = val[i][k]+val[k][j];
    30             }
    31         }
    32     }
    33     return val[s][t];
    34 }
    35 int main()
    36 {
    37     int i,n,m,ans,a,b,s,w,t;
    38     while(~scanf("%d %d",&n,&m))
    39     {
    40         inint(n);
    41         for(i = 0;i < m;i++)
    42         {
    43             scanf("%d %d %d",&a,&b,&w);
    44             if(w < map[a][b])
    45             map[a][b] = map[b][a] = w;
    46         }
    47         scanf("%d %d",&s,&t);
    48         ans = floyd(n,s,t);
    49         if(ans >= max)
    50         printf("-1\n");
    51         else
    52         printf("%d\n",ans);
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    python模块之random模块
    python模块之os模块
    python模块之collections模块
    python模块之re模块
    python基础十五之递归函数
    python基础十四之匿名函数
    python基础十三之内置函数
    leetcode 108 和leetcode 109 II
    leetcode 108 和leetcode 109
    对于final修饰的类型运算时的表现
  • 原文地址:https://www.cnblogs.com/0803yijia/p/2635385.html
Copyright © 2020-2023  润新知