poj 1797 Heavy transportation 最短路

来源:互联网 发布:种植牙费用 知乎 编辑:程序博客网 时间:2024/06/10 22:35

题意:给你一个n个点m条边的无向图 让你求出从起点到终点的路径的最小值最大

思路:和上一题bfs差不多...

#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <queue>using namespace std;const int maxn = 1000 + 10;const int maxe = 500000 + 10;const int INF = 1e9;struct Edge{          int v, d;          int next;          Edge(int v = 0, int d = 0, int next = 0) :                    v(v), d(d), next(next) {}}edge[maxe];int n, m, cas = 0;int Head[maxn], cntE;int min_dis[maxn];vector<int> G[maxn];void init(){          memset(Head, -1, sizeof(Head));          cntE = 0;          for(int i = 0; i < n; i++) G[i].clear();          memset(min_dis, 0, sizeof(min_dis));          min_dis[0] = INF;}void add(int u, int v, int d){          edge[cntE] = Edge(v, d, Head[u]);          Head[u] = cntE++;}void bfs(){          queue<int> Q;          Q.push(0);          while(!Q.empty()){                    int u = Q.front(); Q.pop();                    for(int i = Head[u]; ~i; i = edge[i].next){                              if(min(min_dis[u], edge[i].d) >  min_dis[edge[i].v]){                                        min_dis[edge[i].v] = min(min_dis[u], edge[i].d);                                        Q.push(edge[i].v);                              }                    }          }}void solve(){          scanf("%d%d", &n, &m);          init();          for(int i = 0; i < m; i++){                    int u, v, d;                    scanf("%d%d%d", &u, &v, &d);                    --u; --v;                    add(u, v, d);                    add(v, u, d);          }          bfs();          printf("Scenario #%d:\n%d\n\n", ++cas, min_dis[n-1]);}int main(){          int T;          scanf("%d", &T);          while(T--) solve();          return 0;}


0 0
原创粉丝点击