「洛谷P1343」地震逃生 解题报告
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 1100個(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)題。
- 上一篇: CopyOnWriteArrayList
- 下一篇: 【每日一包0029】merge-desc