洛谷 P 1343
阿新 • • 發佈:2018-11-21
題目描述
汶川地震發生時,四川**中學正在上課,一看地震發生,老師們立刻帶領x名學生逃跑,整個學校可以抽象地看成一個有向圖,圖中有n個點,m條邊。1號點為教室,n號點為安全地帶,每條邊都只能容納一定量的學生,超過樓就要倒塌,由於人數太多,校長決定讓同學們分成幾批逃生,只有第一批學生全部逃生完畢後,第二批學生才能從1號點出發逃生,現在請你幫校長算算,每批最多能運出多少個學生,x名學生分幾批才能運完。
輸入輸出格式
輸入格式:
第一行3個整數n,m,x(x<2^31,n<=200,m<=2000);以下m行,每行三個整數a,b,c(a1,a<>b,0描述一條邊,分別代表從a點到b點有一條邊,且可容納c名學生。
輸出格式:
兩個整數,分別表示每批最多能運出多少個學生,x名學生分幾批才能運完。如果無法到達目的地(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
摸板題了。。。繼續練習最大流手法。。。
不過只需要最後在除以下就好了。。。。
以下為AC 程式碼
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int maxn = 500; const int INF = 0x3f3f3f3f; #define ll long long int ll n,m,k; ll pre[maxn]; ll ed[maxn][maxn]; ll flow[maxn]; ll min(ll a, ll b) { if(a<b) return a; else return b; } bool bfs(int st, int en) { bool vis[maxn]; queue<int> q; memset(vis,false,sizeof(vis)); memset(pre,-1,sizeof(pre)); q.push(st); vis[st]=true; while(q.size()) { int e=q.front(); q.pop(); if(e==en) return true; for(int i=1; i<=n; i++) { if(!vis[i]&&ed[e][i]) { pre[i]=e; vis[i]=true; q.push(i); } } } return false; } ll dfs(int st, int en) { ll u,flow=0,mx; while(bfs(st, en)) { u=en,mx=INF; while(pre[u]!=-1) { mx = min(mx, ed[pre[u]][u]); u = pre[u]; } flow += mx; u = en; while(pre[u]!=-1) { ed[pre[u]][u] -= mx; ed[u][pre[u]] += mx; u = pre[u]; } } return flow; } int main() { scanf("%lld%lld%lld",&n,&m,&k); ll x,y,z; memset(ed,0,sizeof(ed)); for(int i=1;i<=m;i++) { scanf("%lld%lld%lld",&x,&y,&z); ed[x][y]+=z; } ll temp = dfs(1,n); if(temp == 0) { printf("Orz Ni Jinan Saint Cow!\n"); } else if(k%temp == 0) { printf("%lld %lld\n",temp ,k/temp); } else { printf("%lld %lld\n",temp ,k/temp + 1); } return 0; }