网络流

目录

网络流简介

 POJ  1273 Drainage Ditches


另一篇整理的博客

网络流简介

 

 POJ  1273 Drainage Ditches

题意:给定点数,边数,每条 边的容量,以及源点,汇点,求最大流。

#include<iostream>
#include<queue>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn=300;
int G[maxn][maxn];
int Prev[maxn];//存放节点的前驱结点,方便加反向边 
bool Visited[maxn];
int n,m;
/*从结点1开始压入栈中,然后寻找增广路径,并且用Prev来记录结点的前驱结点,找到一条增广路径之后,就开始求最大流
求完最大流之后,再加反向边修改图G。
*/
int Augment()
{
	deque<int>q;
	memset(Prev,0,sizeof(Prev));
	memset(Visited,0,sizeof(Visited));
	Prev[1]=0;
	Visited[1]=1;
	q.push_back(1);
	bool bFindPath=false;
	int v;
	while(!q.empty())
	{
		v=q.front();
	    q.pop_front();
	    for(int i=1;i<=m;i++)
	    {
	    	if(G[v][i]>0 && Visited[i]==0)
	    	{
	    		Prev[i]=v;
	    		Visited[i]=1;
	    		if(i==m)
	    		{
	    			bFindPath=true;
	    			q.clear();
					break;
				}else{
					q.push_back(i);
				}
			}
		}  
	}
	     if(!bFindPath)
	        return 0;
	     int nMinFlow=999999999;
	     v=m;
	     while(Prev[v])
	     {
	     	nMinFlow=min(nMinFlow,G[Prev[v]][v]);
	     	v=Prev[v];
		 }
	     v=m;
	     while(Prev[v])
	     {
	     	G[Prev[v]][v]-=nMinFlow;
			G[v][Prev[v]]+=nMinFlow;//加反向边 
			v=Prev[v]; 
		 }
	return nMinFlow; 
}

int main()
{
   	while(cin>>n>>m)
   	{
   	    int s,e,c;
		memset(G,0,sizeof(G));
		for(int i=0;i<n;i++)
		{
		    cin>>s>>e>>c;
			G[s][e]+=c;	
		}	
		int MaxFlow=0;
		int aug;
		while(aug=Augment())
		{
			MaxFlow+=aug;
		}
		cout<<MaxFlow<<endl;
	}
	return 0;
} 

 增广路径的优化--------->Dinic

#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<deque>
#include<string.h>
using namespace std;
#define INF 999999999
const int maxn=300;
int G[maxn][maxn];
bool Visited[maxn];
int Layer[maxn];//分层数组
int n,m; 
bool CountLayer()
{
	  int layer=0;
	  deque<int>q;
	  memset(Layer,0xff,sizeof(Layer));
	  Layer[1]=0;
	  q.push_back(1);
	  while(!q.empty())
	  {
	  	int v=q.front();
	  	q.pop_front();
	  	for(int j=1;j<=m;j++)
	  	{
	  		if(G[v][j]>0 && Layer[j]==-1)
	  		{
	  		   Layer[j]=Layer[v]+1;
			   if(j==m) //如果已经找到了汇点 
			      return true;
			   else
			      q.push_back(j);
			}
		}
	  }
	  return false;
}
int Dinic()
{
	int s;
	int nMaxFlow=0;
	deque<int>q;
	while(CountLayer())
	{
		q.push_back(1);
		memset(Visited,0,sizeof(Visited));
		Visited[1]=1;
		while(!q.empty())
		{
			int nd=q.back();
			if(nd==m)//nd是汇点 
			{
				int nMinC=INF;//最小流量 
				int nMinC_vs;//容量最小的边的起点 
				for(int i=1;i<q.size();i++)
				{
					int vs=q[i-1];
					int ve=q[i];
					if(G[vs][ve]>0)
					{
						if(nMinC>G[vs][ve])
						{
							nMinC=G[vs][ve];
							nMinC_vs=vs;
						}
					}
				}
				nMaxFlow+=nMinC;
				for(int i=1;i<q.size();i++)
				{
					int vs=q[i-1];
					int ve=q[i];
					G[vs][ve]-=nMinC;
					G[ve][vs]+=nMinC;
				}
				
				while(!q.empty() && q.back()!=nMinC_vs)
				{
					Visited[q.back()]=0;
					q.pop_back();
				}
			}else{ //不是汇点 
			   int i;
				for( i=1;i<=m;i++)
				{
					if(G[nd][i] >0 && Layer[i]==Layer[nd]+1 && !Visited[i])
					{//往下一层没有走过的结点走 
						Visited[i]=1;
						q.push_back(i);
						break;
					}
				}
				if(i>m)//找不到下一个节点 
				  q.pop_back();//回溯 
			}
		}
	}
	return nMaxFlow;
}
int main()
{
    while(cin>>n>>m)
	{
		int s,e,c;
		memset(G,0,sizeof(G));
		for(int i=0;i<n;i++)
		{
			cin>>s>>e>>c;
			G[s][e]+=c;
		}
		cout<<Dinic()<<endl;
	}	
	return 0;
}

 

 

 

 

 

 

 

 

 

在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值