[BZOJ 2200][Usaco2011 Jan]道路和航线 spfa+SLF优化
生活随笔
收集整理的這篇文章主要介紹了
[BZOJ 2200][Usaco2011 Jan]道路和航线 spfa+SLF优化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
Farmer John正在一個新的銷售區域對他的牛奶銷售方案進行調查。他想把牛奶送到T個城鎮 (1 <= T <= 25,000),編號為1T。這些城鎮之間通過R條道路 (1 <= R <= 50,000,編號為1到R) 和P條航線 (1 <= P <= 50,000,編號為1到P) 連接。每條道路i或者航線i連接城鎮A_i (1 <= A_i <= T)到B_i (1 <= B_i <= T),花費為C_i。對于道路,0 <= C_i <= 10,000;然而航線的花費很神奇,花費C_i可能是負數(-10,000 <= C_i <= 10,000)。道路是雙向的,可以從A_i到B_i,也可以從B_i到A_i,花費都是C_i。然而航線與之不同,只可以從A_i到B_i。事實上,由于最近恐怖主義太囂張,為了社會和諧,出臺 了一些政策保證:如果有一條航線可以從A_i到B_i,那么保證不可能通過一些道路和航線從B_i回到A_i。由于FJ的奶牛世界公認十分給力,他需要運送奶牛到每一個城鎮。他想找到從發送中心城鎮S(1 <= S <= T) 把奶牛送到每個城鎮的最便宜的方案,或者知道這是不可能的。Input
* 第1行:四個空格隔開的整數: T, R, P, and S * 第2到R+1行:三個空格隔開的整數(表示一條道路):A_i, B_i 和 C_i * 第R+2到R+P+1行:三個空格隔開的整數(表示一條航線):A_i, B_i 和 C_iOutput
* 第1到T行:從S到達城鎮i的最小花費,如果不存在輸出"NO PATH"。Sample Input
6 3 3 41 2 5
3 4 5
5 6 10
3 5 -100
4 6 -100
1 3 -10
樣例輸入解釋:
一共六個城鎮。在1-2,3-4,5-6之間有道路,花費分別是5,5,10。同時有三條航線:3->5,
4->6和1->3,花費分別是-100,-100,-10。FJ的中心城鎮在城鎮4。
Sample Output
NO PATH
NO PATH
5
0
-95
-100
樣例輸出解釋:
FJ的奶牛從4號城鎮開始,可以通過道路到達3號城鎮。然后他們會通過航線達到5和6號城鎮。
但是不可能到達1和2號城鎮。
Solution
做法:spfa+SLF優化
裸上$spfa$會$T$,加個堆優化也$T$了,所以就$SLF$咯
$Dijkstra$也可以寫但是好麻煩...
寫$Dijkstra$的話要縮點,還要拓撲...所以直接上$spfa+SLF$就好啦
#include <bits/stdc++.h>using namespace std ;#define N 200010 const int inf = 1e10 ;inline void read( int &x ) {x = 0 ; int f = 1 ; char c = getchar() ;while( c < '0' || c > '9' ) { if( c == '-' ) f = -f ; c = getchar() ; }while( c >= '0' && c <= '9' ) { x = (x<<1) + (x<<3) + c - 48 ; c =getchar() ; } x = x * f ; }int n , m1, m2 , s ; int head[ N ] , cnt ; int d[ N ] , vis[ N ] ; struct edge {int to , nxt ,v ; }e[ N ] ;deque < int > q ;void ins( int u , int v , int w ) {e[ ++ cnt ].to = v ;e[ cnt ].nxt = head[ u ] ;e[ cnt ].v = w ;head[ u ] = cnt ; }void spfa() {vis[ s ] = 1 ;for( int i = 1 ; i <= n ; i ++ ) d[ i ] = inf ;d[ s ] = 0 ;q.push_back( s ) ;while( !q.empty() ) {int u = q.front() ;q.pop_front() ;vis[ u ] = 0 ;for( int i = head[ u ] ; i ; i = e[ i ].nxt ) {int v = e[ i ].to ;if( d[ v ] > d[ u ] + e[ i ].v ) {d[ v ] = d[ u ] + e[ i ].v ;if( ! vis[ v ] ) {vis[ v ] = 1 ;if( !q.empty() && d[ v ] >= d[ q.front() ] ) q.push_back( v ) ;else q.push_front( v ) ;}}}} }int main() {read( n ) ; read( m1 ) ; read( m2 ) ; read( s ) ;for( int i = 1 ; i <= m1 ; i ++ ) {int u , v , w ;read( u ) ; read( v ) ; read( w ) ;ins( u , v , w ) ;ins( v , u , w ) ;}for( int i = 1 ; i <= m2 ; i ++ ) {int u , v , w ;read( u ) ;read( v ) ; read( w ) ;ins( u ,v , w ) ;}spfa() ;for( int i = 1 ; i <= n ; i ++ ){if( d[ i ] == inf ) {puts( "NO PATH" ) ;}else printf( "%d\n" , d[ i ] ) ;}return 0 ; }?
轉載于:https://www.cnblogs.com/henry-1202/p/9736702.html
總結
以上是生活随笔為你收集整理的[BZOJ 2200][Usaco2011 Jan]道路和航线 spfa+SLF优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker安装Zabbix
- 下一篇: 关于Unity实现AR功能(四)设置相机