LightOJ-1002-Country Roads [最短路][Dijkstra]

来源:互联网 发布:沙钢收购大数据 编辑:程序博客网 时间:2024/05/25 21:33

题目传送门


题意:给定无向图,求一个城市t到其他城市的最低成本,成本的定义为路径中的最大消费。

思路:这个题跟POJ-2253-Frogger类似,可以用Dijkstra算法变形来写。也可以用kruskal来写。

#include <bits/stdc++.h>using namespace std;int n, m;int mp[550][550];const int INF = 0x3f3f3f3f;void Dij(int x){    int dis[550];    bool vis[550];    memset(dis, INF, sizeof(dis));    memset(vis, false, sizeof(vis));    for (int i = 0; i < n; i++)        dis[i] = mp[x][i];    vis[x] = true;    dis[x] = 0;    for (int i = 0; i < n; i++)    {        int mi = INF;        int f = -1;        for (int j = 0; j < n; j++)        {            if (!vis[j] && dis[j] < mi)            {                mi = dis[j];                f = j;            }        }        if (f==-1)            break;        vis[f] = 1;        for (int j = 0; j < n; j++)        {            if (!vis[j] && dis[j] > max(dis[f],mp[f][j]))            {                dis[j] = max(dis[f], mp[f][j]);            }        }    }    for (int i = 0; i < n; i++)    {        if (dis[i]<INF)            printf("%d\n",dis[i]);        else            printf("Impossible\n");    }    return ;}int main(void){    int T, cas = 1;    scanf("%d", &T);    while (T--)    {        memset(mp, INF, sizeof(mp));        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] = mp[y][x] = s;        }        int p;        scanf("%d", &p);        printf("Case %d:\n",cas++);        Dij(p);    }    return 0;}
原创粉丝点击