Heavy Transportation
题 意:给你n个节点,m个街道,每个街道都有最大的称重量cost,有一辆车从1到n问你n的最大承载量。
数据范围:
1<=n<=1e3
1<=cost<=1000000
输入样例:
1
3 3
1 2 3
1 3 4
2 3 5
输出样例:
Scenario #1:
4
思 路:这次是跟新最大值,每次取出最大的节点出来更新。(lll¬ω¬)和poj2253差不多。还是一样最短路的思路
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 1e3+5;
typedef pair<int,int> P;
struct edge{
int to;
int cost;
};
vector<edge> G[maxn];
int d[maxn];
int n,m;
void dijkstra(int s){
fill(d,d+1+n,0);
d[s] = INF;
priority_queue<P,vector<P>,less<P> >que;
que.push(P(0,s));
while(que.size()){
P p = que.top();que.pop();
int v = p.second;
if(p.first > d[v]) continue;
for(int i=0;i<G[v].size();i++){
edge e = G[v][i];
double temp = min(d[v],e.cost);
if(d[e.to] < temp){
d[e.to] = temp;
que.push(P(d[e.to],e.to));
}
}
}
}
void init(){
for(int i=0;i<=n;i++)G[i].clear();
memset(d,0,sizeof(d));
}
int main(){
int t,Case = 1;
scanf("%d",&t);
while(t--){
scanf("%d %d",&n,&m);
init();
for(int i=0;i<m;i++){
int s,t,cost;
scanf("%d %d %d",&s,&t,&cost);
G[s].push_back(edge{t,cost});
G[t].push_back(edge{s,cost});
}
dijkstra(1);
printf("Scenario #%d:\n",Case++);
printf("%d\n\n",d[n]);
}
return 0;
}