zoukankan      html  css  js  c++  java
  • POJ 2387 Til the Cows Come Home --最短路模板题

    Dijkstra模板题,也可以用Floyd算法。

    关于Dijkstra算法有两种写法,只有一点细节不同,思想是一样的。

    写法1:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #define Mod 1000000007
    using namespace std;
    #define N 1007
    
    int mp[N][N],n,m;
    int dis[N],vis[N];
    
    void Dijastra(int s)
    {
        int now = s;
        int i,k;
        dis[now] = 0;
        vis[now] = 1;
        for(i=1;i<=n;i++)
        {
            for(k=1;k<=n;k++)  //order 1
            {
                if(mp[now][k] != Mod && dis[now] + mp[now][k] < dis[k])
                    dis[k] = dis[now] + mp[now][k];
            }
            int mini = Mod;   //order 2
            for(k=1;k<=n;k++)
            {
                if(dis[k] < mini && !vis[k])
                {
                    now = k;
                    mini = dis[k];
                }
            }
            vis[now] = 1;
        }
    }
    
    int main()
    {
        int u,v,w,i,j;
        while(scanf("%d%d",&m,&n)!=EOF)
        {
            for(i=1;i<=n;i++)
                dis[i] = Mod;
            dis[1] = 0;
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=n;j++)
                    mp[i][j] = Mod;
                mp[i][i] = 0;
            }
            while(m--)
            {
                scanf("%d%d%d",&u,&v,&w);
                if(w < mp[u][v])
                    mp[u][v] = mp[v][u] = w;
            }
            memset(vis,0,sizeof(vis));
            Dijastra(1);
            printf("%d
    ",dis[n]);
        }
        return 0;
    }
    View Code

    写法2:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #define Mod 1000000007
    using namespace std;
    #define N 1007
    
    int mp[N][N],n,m;
    int dis[N],vis[N];
    
    void Dijastra(int s)
    {
        int now;
        int i,k;
        dis[s] = 0;
        for(i=1;i<=n;i++)
        {
            int mini = Mod;  //order 1
            for(k=1;k<=n;k++)
            {
                if(dis[k] < mini && !vis[k])
                {
                    now = k;
                    mini = dis[k];
                }
            }
            vis[now] = 1;
            for(k=1;k<=n;k++)  //order 2
            {
                if(mp[now][k] != Mod && dis[now] + mp[now][k] < dis[k])
                    dis[k] = dis[now] + mp[now][k];
            }
        }
    }
    
    int main()
    {
        int u,v,w,i,j;
        while(scanf("%d%d",&m,&n)!=EOF)
        {
            for(i=1;i<=n;i++)
                dis[i] = Mod;
            dis[1] = 0;
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=n;j++)
                    mp[i][j] = Mod;
                mp[i][i] = 0;
            }
            while(m--)
            {
                scanf("%d%d%d",&u,&v,&w);
                if(w < mp[u][v])
                    mp[u][v] = mp[v][u] = w;
            }
            memset(vis,0,sizeof(vis));
            Dijastra(1);
            printf("%d
    ",dis[n]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Go语言基础(四)
    Go语言基础(一)
    Go语言简介和开发环境搭建
    数据分析(四)数据可视化之Matplotlib
    数据分析(三)Pandas
    git简介与基本操作
    drf框架之三大认证之频率类源码分析
    数据分析(二)numpy
    换零钱问题的非递归解法 SICP 1.2.2中的一个问题
    # Java中的代理类
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3604093.html
Copyright © 2011-2022 走看看