poj1797 - Heavy Transportation(最大边,最短路变形spfa)

题目大意:

给你以T, 代表T组测试数据,一个n代表有n个点, 一个m代表有m条边, 每条边有三个参数,a,b,c表示从a到b的这条路上最大的承受重量是c,

让你找出一条线路,要求出在这条线路上的最小承重, 在所有其他线路最大。

题目分析:

这里只要将spfa进行一下变形就可以解决这问题了。

首先 我们的dist数组,起点位置要初始化为 INF, 其他位置初始化为 0

然后我们更新 dist 数组, 结果输出 dist[n]就行了

为什么这样写: 因为我们每次要找 所有路径中的最大边的最小一个, 说的可能有写绕口

递推式是: dist[e] = max(dist[e], min(dist[s], G[s][i]) );

下面是代码:

 

 1 #include <iostream>

 2 #include <cstdlib>

 3 #include <cstdio>

 4 #include <algorithm>

 5 #include <vector>

 6 #include <queue>

 7 using namespace std;

 8 #define INF 0xfffffff

 9 #define maxn 1050

10 

11 struct Edge

12 {

13     int e;

14     long long w;

15 };

16 vector<Edge> G[maxn];

17 long long dist[maxn];

18 bool vis[maxn];

19 int m, n;

20 long long Spfa()

21 {

22     Edge P, Pn;

23     P.e = 1, P.w = 0;

24     queue <Edge> Q;

25     Q.push(P);

26 

27     while( !Q.empty() )

28     {

29         P = Q.front();

30         Q.pop();

31         vis[P.e] = false;

32         int len = G[P.e].size();

33 

34         for(int i=0; i<len; i++)

35         {

36             Pn = G[P.e][i];

37 

38             if(dist[Pn.e] < min(dist[P.e],Pn.w) )

39             {

40                 dist[Pn.e] = min(dist[P.e],Pn.w);

41 

42                 if(!vis[Pn.e])

43                 {

44                     vis[Pn.e] = true;

45                     Q.push(Pn);

46                 }

47             }

48         }

49     }

50     return dist[n];

51 }

52 void Init()

53 {

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

55     {

56         G[i].clear();

57         vis[i] = false;

58         dist[i] = 0;

59     }

60     dist[1] = INF;

61 }

62 int main()

63 {

64     int T, cas = 1;

65     Edge P;

66     cin >> T;

67 

68     while(T--)

69     {

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

71 

72         Init();

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

74         {

75             int a, b, c;

76             scanf("%d%d%d",&a,&b,&c);

77             P.e = b, P.w = c;

78 

79             G[a].push_back(P);

80 

81             P.e = a;

82 

83             G[b].push_back(P);

84         }

85         long long ans = Spfa();

86 

87         printf("Scenario #%d:\n%lld\n",cas++,ans);

88         if(T)

89             printf("\n");

90 

91     }

92     return 0;

93 }

 

你可能感兴趣的:(port)