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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

「洛谷P1343」地震逃生 解题报告

發(fā)布時(shí)間:2025/5/22 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 「洛谷P1343」地震逃生 解题报告 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

P1343 地震逃生

題目描述

汶川地震發(fā)生時(shí),四川XX中學(xué)正在上課,一看地震發(fā)生,老師們立刻帶領(lǐng)x名學(xué)生逃跑,整個(gè)學(xué)??梢猿橄蟮乜闯梢粋€(gè)有向圖,圖中有n個(gè)點(diǎn),m條邊。1號(hào)點(diǎn)為教室,n號(hào)點(diǎn)為安全地帶,每條邊都只能容納一定量的學(xué)生,超過(guò)樓就要倒塌,由于人數(shù)太多,校長(zhǎng)決定讓同學(xué)們分成幾批逃生,只有第一批學(xué)生全部逃生完畢后,第二批學(xué)生才能從1號(hào)點(diǎn)出發(fā)逃生,現(xiàn)在請(qǐng)你幫校長(zhǎng)算算,每批最多能運(yùn)出多少個(gè)學(xué)生,x名學(xué)生分幾批才能運(yùn)完。

輸入輸出格式

輸入格式:

第一行3個(gè)整數(shù)n,m,x(\(x<2^{31},n \le 200,m \le 2000\));以下m行,每行三個(gè)整數(shù)a,b,c(a1,a<>b,0描述一條邊,分別代表從a點(diǎn)到b點(diǎn)有一條邊,且可容納c名學(xué)生。

輸出格式:

兩個(gè)整數(shù),分別表示每批最多能運(yùn)出多少個(gè)學(xué)生,x名學(xué)生分幾批才能運(yùn)完。如果無(wú)法到達(dá)目的地(n號(hào)點(diǎn))則輸出“Orz Ni Jinan Saint Cow!”

輸入輸出樣例

輸入樣例#1:

6 7 7 1 2 1 1 4 2 2 3 1 4 5 1 4 3 1 3 6 2 5 6 1

輸出樣例#1:

3 3

說(shuō)明

【注釋】

比如有圖

1 2 1002 3 1

100個(gè)學(xué)生先沖到2號(hào)點(diǎn),然后1個(gè)1個(gè)慢慢沿2-3邊走過(guò)去

18神牛規(guī)定這樣是不可以的……

也就是說(shuō),每批學(xué)生必須同時(shí)從起點(diǎn)出發(fā),并且同時(shí)到達(dá)終點(diǎn)


算法

網(wǎng)絡(luò)最大流。 請(qǐng)大家先掌握,這里不詳細(xì)講。

思路

很明顯,1是源點(diǎn),n是匯點(diǎn),直接網(wǎng)絡(luò)最大流模板即可。
這里數(shù)據(jù)十分小,用Edmonds-Karp或Dinic都可以。
我才不告訴你EK怎么打忘光了
用網(wǎng)絡(luò)流求出了每次能通過(guò)的學(xué)生數(shù)ans后,就可以直接求出分成\(floor(frac{ans - 1}x) + 1\)次通過(guò)。總體來(lái)說(shuō)不是很難,具體看代碼QAQ

代碼

#include<bits/stdc++.h> using namespace std; #define open(s) freopen( s".in", "r", stdin ), freopen( s".out", "w", stdout ) #define MAXN 205 #define MAXM 4005 //建雙向邊要開兩倍別忘了int n, m, X, ans;//小寫的x會(huì)沖突(下5行) QAQ 只好改大寫 int hd[MAXN], nxt[MAXM], to[MAXM], val[MAXM], tot(1);//MAXN、MAXM別看錯(cuò)了 ~~我才不告訴你為了這個(gè)我錯(cuò)了好幾遍~~ //還有tot要賦值為1**千萬(wàn)**別忘了 ~~我又為這個(gè)調(diào)試了好久~~(不用成對(duì)存儲(chǔ)的請(qǐng)忽略這句話) int dis[MAXN]; queue<int> Q; int S, T; int x, y;void Add( int x, int y, int z ){nxt[++tot] = hd[x]; hd[x] = tot; to[tot] = y; val[tot] = z;}//鏈?zhǔn)角跋蛐侨f(wàn)歲!~~雖然鄰接矩陣也可以~~bool BFS(){//分層while( !Q.empty() ) Q.pop();//清空queue 懶得手打隊(duì)列QAQmemset( dis, 0, sizeof dis );//初始化別忘了Q.push(S); dis[S] = 1;while( !Q.empty() ){x = Q.front(); Q.pop();for ( int i = hd[x]; i; i = nxt[i] ){if ( val[i] && !dis[to[i]] ){dis[to[i]] = dis[x] + 1;Q.push( to[i] );if ( to[i] == T ) return 1;}}}return 0; }int DFS( int x, int fl ){if ( x == T ) return fl;int res(fl), k;for ( int i = hd[x]; i && res; i = nxt[i] ){if ( ( dis[to[i]] == dis[x] + 1 ) && val[i] ){k = DFS( to[i], min( res, val[i] ) );if ( !k ) dis[to[i]] = 0; //剪枝! 不能再增廣的點(diǎn)去掉!val[i] -= k; val[i^1] += k; res -= k; //成對(duì)存儲(chǔ)}}return fl - res; }int main(){scanf( "%d%d%d", &n, &m, &X );S = 1; T = n;for ( int i = 1; i <= m; ++i ){int x, y, z; scanf( "%d%d%d", &x, &y, &z );Add( x, y, z ); Add( y, x, 0 );}int t;while( BFS() ) while( ( t = DFS( S, INT_MAX ) ) > 0 ) ans += t;if ( ans ) printf( "%d %d\n", ans, ( X - 1 ) / ans + 1 );//同上else printf( "Orz Ni Jinan Saint Cow!\n" ); //這是誰(shuí)?return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/louhancheng/p/10118566.html

總結(jié)

以上是生活随笔為你收集整理的「洛谷P1343」地震逃生 解题报告的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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