0
点赞
收藏
分享

微信扫一扫

Heavy Transportation spfa算法

题目Heavy Transportation spfa算法_#define题意:这道题的意思和 Frogger 很像。求所有路径中每个路径最小的一段道路,这些道路组成一个集合,再求这个集合中最大的数。
思路:`
核心代码

for(int i=head[n];i!=-1;i=Node[i].next){
Node e=Node[i];
if(d[e.v]<min(d[u],e.d){
d[e.v]=min(d[u],e.d);
}`
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn = 100100, INF = 0xfffffff;
int head[maxn], vis[maxn], d[maxn];
int n, m;
struct node {
int u, v, d, next;
} Node[maxn];
void add(int u, int v, int d, int i) {
Node[i].u = u;
Node[i].v = v;
Node[i].d = d;
Node[i].next = head[u];
head[u] = i;
}
void spfa(int s) {
mem(d, 0);
d[s] = INF;
mem(vis, 0);
queue<int> Q;
Q.push(s);
vis[s] = 1;
while(!Q.empty()) {
int u = Q.front();
Q.pop();
vis[u] = 0;
for(int i = head[u]; i != -1; i = Node[i].next) {
node e = Node[i];
if(d[e.v] < min(d[u], e.d)) {
d[e.v] = min(d[u], e.d);
if(!vis[e.v]) {
Q.push(e.v);
vis[e.v] = 1;
}
}
}
}
}
int main() {
int cnt = 0;
int T;
scanf("%d", &T);
while(T--) {
mem(head, -1);
scanf("%d%d", &n, &m);
int ans = 0;
for(int i = 1; i <= m; i++) {
int u, v, d;
scanf("%d%d%d", &u, &v, &d);
add(u, v, d, ans++);
add(v, u, d, ans++);
}
spfa(1);
printf("Scenario #%d:\n", ++cnt);
printf("%d\n", d[n]);
printf("\n");
}
return 0;
}


举报

相关推荐

0 条评论