• POJ 1502 MPI Maelstrom( Spfa, Floyd, Dijkstra)


    题目大意:

    给你 1到n ,  n个计算机进行数据传输, 问从1为起点传输到所有点的最短时间是多少, 其实就是算 1 到所有点的时间中最长的那个点。

    然后是数据 

    给你一个n 代表有n个点, 然后给你一个邻接矩阵, 只有一半,另一半自己补

    下面是练习的代码。 分别用了Floyd 和 Dijkstra 还有 Spfa(邻接矩阵版)

    #include <iostream>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <algorithm>
    #include <vector>
    #include <queue>
    using namespace std;
    #define INF 0xfffffff
    #define maxn 1006
    #define min(a,b) (a<b?a:b)
    #define max(a,b) (a>b?a:b)
    int n;
    int maps[maxn][maxn], dist[maxn];
    bool vis[maxn];
    
    int Dijkstra()
    {
        dist[1] = 0;
        for(int i=1; i<=n; i++)
        {
            int index, Min = INF;
    
            for(int j=1; j<=n; j++)
            {
                if(!vis[j]  && Min > dist[j])
                    index = j, Min = dist[j];
            }
    
            vis[index] = true;
    
            for(int j=1; j<=n; j++)
            {
                if( !vis[j] )
                    dist[j] = min(dist[j], dist[index] + maps[index][j]);
            }
        }
        int Max = 0;
        for(int i=2; i<=n; i++)
            Max = max(Max, dist[i]);
    
        return Max;
    }
    void ReadMaps()
    {
        char str[30];
    
        memset(vis,false,sizeof(vis));
    
        for(int i=1; i<=n; i++)
        {
            dist[i] = INF;
            maps[i][i] = 0;
            for(int j=1; j<i; j++)
            {
                scanf("%s", str);
    
                if(strcmp(str,"x") == 0)
                    maps[i][j] = INF;
                else
                    sscanf(str,"%d", &maps[i][j]);
    
                maps[j][i] = maps[i][j];
            }
        }
    }
    int main()
    {
        while(cin >> n)
        {
            ReadMaps();
    
            int ans = Dijkstra();
    
            cout << ans << endl;
        }
        return 0;
    }
    #include <iostream>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <algorithm>
    #include <vector>
    #include <queue>
    using namespace std;
    #define INF 0xfffffff
    #define maxn 120
    
    int G[maxn][maxn];
    int n;
    void Floyd();
    void Slove();
    void Init();
    
    
    int main()
    {
        char str[50];
        int a;
        while(cin>> n)
        {
            Init();
    
            for(int i=2; i<=n; i++)
            {
                for(int j=1; j<i; j++)
                {
                    scanf("%s", str);
    
                    if(str[0] == 'x')
                        a = INF;
                    else
                        sscanf(str,"%d", &a);
    
                    G[i][j] = G[j][i] = a;
                }
            }
    
            Slove();
        }
    
        return 0;
    }
    void Floyd()
    {
        for(int k=1; k<=n; k++)
        {
            for(int i=1; i<=n; i++)
            {
                for(int j=1; j<=n; j++)
                {
                    G[i][j] = min(G[i][j],G[i][k] + G[k][j]);
                }
            }
        }
    }
    void Slove()
    {
        Floyd();
        int Max = 0;
        for(int i=1; i<=n; i++)
        {
            Max = max(Max, G[1][i]);
        }
    
        cout << Max << endl;
    }
    void Init()
    {
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<i; j++)
                G[i][j] = G[j][i] = INF;
            G[i][i] = 0;
        }
    }
    #include <iostream>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <algorithm>
    #include <vector>
    #include <queue>
    using namespace std;
    #define INF 0xfffffff
    #define maxn 120
    
    int G[maxn][maxn];
    int n, dist[maxn], vis[maxn];
    void Spaf();
    void Slove();
    void Init();
    
    
    int main()
    {
        char str[50];
        int a;
        while(cin>> n)
        {
            Init();
    
            for(int i=2; i<=n; i++)
            {
                for(int j=1; j<i; j++)
                {
                    scanf("%s", str);
    
                    if(str[0] == 'x')
                        a = INF;
                    else
                        sscanf(str,"%d", &a);
    
                    G[i][j] = G[j][i] = a;
                }
            }
    
            Slove();
        }
    
        return 0;
    }
    void Spfa()
    {
        int p;
        queue<int> Q;
        Q.push(1);
        dist[1] = 0;
        while( !Q.empty() )
        {
            p = Q.front();
            Q.pop();
            vis[p] = false;
            for(int i=1; i<=n; i++)
            {
                if(dist[i] > dist[p] + G[p][i])
                {
                    dist[i] = dist[p] + G[p][i];
    
                    if( !vis[i] )
                    {
                        Q.push(i);
                        vis[i] = true;
                    }
                }
            }
        }
    }
    void Slove()
    {
        Spfa();
        int Max = 0;
        for(int i=1; i<=n; i++)
        {
            Max = max(Max, dist[i]);
        }
    
        cout << Max << endl;
    }
    void Init()
    {
        for(int i=1; i<=n; i++)
        {
            dist[i] = INF, vis[i] = false;
            for(int j=1; j<i; j++)
                G[i][j] = G[j][i] = INF;
            G[i][i] = 0;
        }
    }
  • 相关阅读:
    交换机技术
    第七周课后总结
    以太网原理
    test
    NetCore第一步:千里之行 始于环境构筑
    第二十课(一)
    第十九课(三)
    第十九课(二)
    第十九课(一)
    第十八课(三)
  • 原文地址:https://www.cnblogs.com/chenchengxun/p/4147116.html
Copyright © 2020-2023  润新知