您的位置:首页 > 其它

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

2014-12-09 10:32 357 查看
题目大意:

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

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

题目分析:

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

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

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

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

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

下面是代码:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define INF 0xfffffff
#define maxn 1050

struct Edge
{
int e;
long long w;
};
vector<Edge> G[maxn];
long long dist[maxn];
bool vis[maxn];
int m, n;
long long Spfa()
{
Edge P, Pn;
P.e = 1, P.w = 0;
queue <Edge> Q;
Q.push(P);

while( !Q.empty() )
{
P = Q.front();
Q.pop();
vis[P.e] = false;
int len = G[P.e].size();

for(int i=0; i<len; i++)
{
Pn = G[P.e][i];

if(dist[Pn.e] < min(dist[P.e],Pn.w) )
{
dist[Pn.e] = min(dist[P.e],Pn.w);

if(!vis[Pn.e])
{
vis[Pn.e] = true;
Q.push(Pn);
}
}
}
}
return dist
;
}
void Init()
{
for(int i=1; i<=n ;i++)
{
G[i].clear();
vis[i] = false;
dist[i] = 0;
}
dist[1] = INF;
}
int main()
{
int T, cas = 1;
Edge P;
cin >> T;

while(T--)
{
scanf("%d%d",&n,&m);

Init();
for(int i=0; i<m; i++)
{
int a, b, c;
scanf("%d%d%d",&a,&b,&c);
P.e = b, P.w = c;

G[a].push_back(P);

P.e = a;

G[b].push_back(P);
}
long long ans = Spfa();

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

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: