• 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
  • 相关阅读:
    并发编程之多线程(理论部分)
    基于TCP和UDP的socket
    ajax笔记 显示出所城市名称 ShowCity.aspx Html代码
    蒸饭的纱布
    ajax 笔记--不刷新实现简单的留言版 guestBook
    从表的第几条取到第几条记录
    在asp.net添加数据到XML里去
    ajax 笔记-- 写了一个不用刷新就能实现--用户名验证的例子
    今天生日
    ajax 笔记不用刷新实现数据的分页显示
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3604093.html
Copyright © 2020-2023  润新知