Luogu P1343 Earthquake Escape (la placa de red más grande)

Enlace de tema

Descripción del Título

Cuando ocurrió el terremoto de Wenchuan, la Escuela Secundaria Sichuan ** estaba en clase. Tan pronto como ocurrió el terremoto, los maestros inmediatamente llevaron a x estudiantes a escapar. Toda la escuela se puede resumir como un gráfico dirigido con n puntos y m bordes. El punto 1 es el aula y el punto n es la zona de seguridad. Cada lado solo puede acomodar a un cierto número de estudiantes. Si se excede el edificio, se derrumbará. Debido a la gran cantidad de personas, el director decidió dejar que los estudiantes escapen en varios lotes, solo el primer lote. Después de que todos los estudiantes hayan escapado, el segundo grupo de estudiantes puede escapar del punto 1. Ahora, ayude al director a calcular el número máximo de estudiantes que se pueden transportar en cada grupo, y x estudiantes se pueden transportar en varios grupos.

Formato de entrada

La primera línea de 3 enteros n, m, x (x <2 ^ 31, n <= 200, m <= 2000); las siguientes m líneas, cada línea de tres enteros a, b, c (a, b, c descripción Una arista, respectivamente, representa una arista desde el punto a al punto b, y puede acomodar a c estudiantes)

Formato de salida

Dos números enteros indican respectivamente el número máximo de estudiantes que se pueden enviar en cada lote y el número de lotes de x estudiantes que se pueden enviar. Si no puede llegar al destino (punto n), escriba "Orz Ni Jinan Saint Cow!"

entrar

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

Salida

3 3

Código

#include<map>
#include<set>
#include<stack>
#include<queue>
#include<string>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int maxn=1e6+5;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int minn=0xc0c0c0c0;
bool flag,vis[maxn];
int a,b,c,n,m,x,s,t,ans,Min,pre[maxn],edge[500][500];
bool find()
{
    
    
	queue<int> que;
	memset(pre,-1,sizeof pre);
	memset(vis,false,sizeof vis);
	vis[s]=1;
	que.push(s);
	while(!que.empty())
	{
    
    
		int u=que.front();
		que.pop();
		for(int i=1;i<=n;i++)
		{
    
    
			if(!vis[i]&&edge[u][i]>0)
			{
    
    
				pre[i]=u;//记录路径 
				vis[i]=true;//防环 
				que.push(i);
				if(i==t)
					return true;
			}
		}
	}
	return false;
}
void dfs()
{
    
    
	if(!find())
		return ;//已无增广路,即ans已是最大流 
	Min=inf;
	for(int i=t;i!=s;i=pre[i])
		Min=min(Min,edge[pre[i]][i]);//寻找最短的残差路
	for(int i=t;i!=s;i=pre[i])
	{
    
    
		edge[pre[i]][i]-=Min;
		edge[i][pre[i]]+=Min;
	}//更新 
	ans+=Min;
	dfs();
}
int main()
{
    
    
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	flag=true;
	cin>>n>>m>>x;
	s=n;
	t=1;
	for(int i=1;i<=m;i++)
	{
    
    
		cin>>a>>b>>c;
		edge[b][a]+=c;
	}
	dfs();
	if(ans==0)
		cout<<"Orz Ni Jinan Saint Cow!"<<endl;
	else
		cout<<ans<<" "<<x/ans+(x%ans==0?0:1)<<endl;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/WTMDNM_/article/details/108778057
Recomendado
Clasificación