poj-1797-Heavy Transportation [最短路][Dijkstra]

来源:互联网 发布:三级数据库题型 编辑:程序博客网 时间:2024/05/21 05:38

题目传送门


题意:给出一些路口之间相连的路,以及路的最大承重,求从1到n的最大承重量。

思路:从1到n的最大承重量即为路径中的最小承重量。用dis[j] = min(mp[f][j], dis[f])每次更新最小承重量。

#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <cmath>#include <queue>#include <set>#include <map>using namespace std;int mp[1200][1200];int n,m;const int inf = 0x3f3f3f3f;void init(){    for (int i = 0; i < 1200; i++)        for (int j = 0; j < 1200; j++)            mp[i][j] = 0;    return ;}int Dij(int x){    int book[1200], dis[1200];    memset(book,0,sizeof(book));    for (int i = 1; i <= n; i++)        dis[i] = mp[x][i];    book[x] = 1;    for (int i = 1; i < n; i++)    {        int mi = 0, f = -1;        for (int j = 1; j <= n; j++)        {            if (!book[j] && mi<dis[j])            {                mi = dis[j];                f = j;            }        }        if (f==-1)            break;        book[f]=1;        for (int j = 1; j <= n; j++)        {            if (!book[j] && dis[j]<min(mp[f][j], dis[f]))            {                dis[j] = min(mp[f][j], dis[f]);            }        }    }    return dis[n];} int main(void){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    int T, t;    scanf("%d", &T);    t = 0;    while (T--)    {        init();        scanf("%d %d", &n, &m);        while (m--)        {            int x, y, s;            scanf("%d %d %d", &x, &y, &s);            if (mp[x][y]>s || mp[x][y]==0)                mp[x][y] = mp[y][x] = s;         }        printf("Scenario #%d:\n", ++t);        printf("%d\n\n", Dij(1));    }    return 0;}
阅读全文
0 0