POJ

来源:互联网 发布:松下触摸屏编程软件 编辑:程序博客网 时间:2024/05/22 00:36

题目大意:n 个城市 m 条道路,每条路都有一个承载量,求最大承载量。
解题思路:最大生成树,无向图,dijkstra。对于每条路线来说,最大承载量是该条路线所有道路承载量中的最小值

#include<iostream>#include<stdio.h>#include<algorithm>#include<cmath>#include<string.h>#include<string>#include<queue>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))const int INF = 0x3f3f3f3f;const int NINF = -INF -1;const int MAXN = 1e3+5;using namespace std;int T, n, m;int map[MAXN][MAXN];int dis[MAXN];bool vis[MAXN];void dijkstra() {    for (int i = 1; i <= n; i++)        dis[i] = map[1][i];    for (int i = 1; i <= n; i++) {        int v, maxx = -1;        for (int j = 1; j <= n; j++)            if (!vis[j] && dis[j] > maxx) {                maxx = dis[j];                v = j;            }        vis[v] = true;        for (int j = 1; j <= n; j++)            if (!vis[j] && dis[j] < min(dis[v], map[v][j]))                dis[j] = min(dis[v], map[v][j]);    }}int main() {    scanf("%d", &T);    for (int t = 0; t < T; t++) {        scanf("%d%d", &n, &m);        memset(map, 0, sizeof(map));        memset(vis, 0, sizeof(vis));        memset(dis, 0, sizeof(dis));        for (int i = 0; i < m; i++) {            int a, b, l;            scanf("%d%d%d", &a, &b, &l);            map[a][b] = map[b][a] = l;        }        dijkstra();        printf("Scenario #%d:\n%d\n\n", t+1, dis[n]);    }    return 0;}