1379:熱浪(heatwv)
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 3345 通過數: 1744
【題目描述】
德克薩斯純樸的民眾們這個夏天正在遭受巨大的熱浪!!!他們的德克薩斯長角牛吃起來不錯,可是他們並不是很擅長生產富含奶油的乳製品。Farmer John此時以先天下之憂而憂,後天下之樂而樂的精神,身先士卒地承擔起向德克薩斯運送大量的營養冰涼的牛奶的重任,以減輕德克薩斯人忍受酷暑的痛苦。
FJ已經研究過可以把牛奶從威斯康星運送到德克薩斯州的路線。這些路線包括起始點和終點先一共經過T (1 ≤ T ≤ 2,500)個城鎮,方便地標號為1到T。除了起點和終點外的每個城鎮由兩條雙向道路連向至少兩個其它的城鎮。每條道路有一個通過費用(包括油費,過路費等等)。
給定一個地圖,包含C (1 ≤ C ≤ 6,200)條直接連接2個城鎮的道路。每條道路由道路的起點Rs,終點Re (1 ≤ Rs ≤ T; 1 ≤ Re ≤ T),和花費(1 ≤ Ci ≤ 1,000)組成。求從起始的城鎮Ts (1 ≤ Ts ≤ T)到終點的城鎮Te(1 ≤ Te ≤ T)最小的總費用。
【輸入】
第一行: 4個由空格隔開的整數: T, C, Ts, Te;
第2到第C+1行: 第i+1行描述第i條道路。有3個由空格隔開的整數: Rs, Re和Ci。
【輸出】
一個單獨的整數表示從Ts到Te的最小總費用。數據保證至少存在一條道路。
【輸入樣例】
7 11 5 4
2 4 2
1 4 3
7 2 2
3 4 3
5 7 5
7 3 3
6 1 1
6 3 4
2 4 3
5 6 3
7 2 1
【輸出樣例】
7
【提示】
【樣例說明】
5->6->1->4 (3 + 1 + 3)
思路:這題數據比較大用spfa算法比較好,用floyd容易超時。直接上SPFA模板。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define N 30000
using namespace std;
int T,C,Ts,Te;
struct node{
int to;
int dis;
int next;
}e[N];
int head[N];
int dis[N];
int vis[N];
int cnt;
void add(int from,int to,int dis){
e[++cnt].next = head[from];
e[cnt].to = to;
e[cnt].dis = dis;
head[from] = cnt;
}
void SPFA(){
queue<int> q;
q.push(Ts);
vis[Ts] = 1;
dis[Ts] = 0;
while(!q.empty()){
int top = q.front();
q.pop();
vis[top] = 0;
for(int i = head[top];i!=0;i = e[i].next)
{
int to = e[i].to;
int dist = e[i].dis;
if(dis[to] > dist + dis[top]){
dis[to] = dist + dis[top];
if(!vis[to]){
vis[to] = 1;
q.push(to);
}
}
}
}
}
int main(){
cin >> T >> C >> Ts >> Te;
int a, b, c;
memset(head,0,sizeof(head));
memset(vis,0,sizeof(vis));
memset(dis,0x3f3f3f3f,sizeof(dis));
for(int i = 0; i < C;i++){
cin >> a >> b >> c;
add(a,b,c);
add(b,a,c);
}
SPFA();
cout << dis[Te] << endl;
return 0;
}