poj1797

来源:互联网 发布:黑客破解刷扣币软件 编辑:程序博客网 时间:2024/05/17 06:14

题意:N个城市,M条街道,求出货车通过的最大载重量

思路:用dijkstra算法求最短路 松弛过程(例如 A到B 可经过C再到B )中保证   A到C  和  C到B  权值都大于  A到B  那么取其中较小的  否则取A到B

#include <iostream>

#include <cstdio>

#include <algorithm>

#include <cstring>

#include <cmath>

#define MAXN 1200

#define INF 200000000

using namespace std;


int map[MAXN][MAXN];

bool vis[MAXN];

int d[MAXN];

int n,m;


void dijstra()

{

    int now,minx;

         for(int i = 1; i <= n; i++)

    {

        d[i] = map[1][i];

    }

    vis[1] = true;

    for(int i = 1; i <= n-1; i++)

    {

         minx = 0;


        for(int j = 1; j <= n; j++)

        {

            if(!vis[j] && d[j] > minx)

            {

                minx = d[j];

                now = j;


            }

        }

        vis[now] = 1;

        for(int j = 1; j <= n; j++)

        {

            if(!vis[j] && map[now][j]>d[j]&&d[now]>d[j])

                d[j] = min(d[now],map[now][j]);


        }

    }


}

int main()

{


    int T;

     int ant = 1;

    scanf("%d",&T);

    while( T -- )

    {

        scanf("%d%d",&n,&m);

        memset(map,0,sizeof(map));

        for(int i = 0; i < m; i++)

        {

             int x,y,len;

            scanf("%d%d%d",&x,&y,&len);

            map[x][y] = map[y][x] = len;

        }

        memset(vis,0,sizeof(vis));

        for(int i = 1; i <= n; i++)

        {

            d[i] = INF;

        }


        dijstra();

          printf("Scenario #%d:\n",ant ++);

        printf("%d\n\n",d[n]);


    }


    return 0;

}



0 0
原创粉丝点击