日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[BZOJ 2200][Usaco2011 Jan]道路和航线 spfa+SLF优化

發(fā)布時間:2024/6/30 编程问答 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [BZOJ 2200][Usaco2011 Jan]道路和航线 spfa+SLF优化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Description

Farmer John正在一個新的銷售區(qū)域?qū)λ呐D啼N售方案進行調(diào)查。他想把牛奶送到T個城鎮(zhèn) (1 <= T <= 25,000),編號為1T。這些城鎮(zhèn)之間通過R條道路 (1 <= R <= 50,000,編號為1到R) 和P條航線 (1 <= P <= 50,000,編號為1到P) 連接。每條道路i或者航線i連接城鎮(zhèn)A_i (1 <= A_i <= T)到B_i (1 <= B_i <= T),花費為C_i。對于道路,0 <= C_i <= 10,000;然而航線的花費很神奇,花費C_i可能是負數(shù)(-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的奶牛世界公認十分給力,他需要運送奶牛到每一個城鎮(zhèn)。他想找到從發(fā)送中心城鎮(zhèn)S(1 <= S <= T) 把奶牛送到每個城鎮(zhèn)的最便宜的方案,或者知道這是不可能的。

Input

* 第1行:四個空格隔開的整數(shù): T, R, P, and S * 第2到R+1行:三個空格隔開的整數(shù)(表示一條道路):A_i, B_i 和 C_i * 第R+2到R+P+1行:三個空格隔開的整數(shù)(表示一條航線):A_i, B_i 和 C_i

Output

* 第1到T行:從S到達城鎮(zhèn)i的最小花費,如果不存在輸出"NO PATH"。

Sample Input

6 3 3 4
1 2 5
3 4 5
5 6 10
3 5 -100
4 6 -100
1 3 -10

樣例輸入解釋:

一共六個城鎮(zhèn)。在1-2,3-4,5-6之間有道路,花費分別是5,5,10。同時有三條航線:3->5,
4->6和1->3,花費分別是-100,-100,-10。FJ的中心城鎮(zhèn)在城鎮(zhèn)4。

Sample Output


NO PATH
NO PATH
5
0
-95
-100

樣例輸出解釋:

FJ的奶牛從4號城鎮(zhèn)開始,可以通過道路到達3號城鎮(zhèn)。然后他們會通過航線達到5和6號城鎮(zhèn)。
但是不可能到達1和2號城鎮(zhèn)。

Solution

做法:spfa+SLF優(yōu)化

裸上$spfa$會$T$,加個堆優(yōu)化也$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 ; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/henry-1202/p/9736702.html

總結(jié)

以上是生活随笔為你收集整理的[BZOJ 2200][Usaco2011 Jan]道路和航线 spfa+SLF优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。