PKU 1273 Drainage Ditches
分析:第一个网络最大流的题目,绝对经典,值得一做。代码没怎么优化,方便做参考。
Code
#include <iostream>
#include <deque>
#include <queue>
using namespace std;
#define MAXN 201
int Map[MAXN][MAXN],n;
typedef struct __Path
{
int s,t;
}Path; // 路
typedef deque<Path> PathList; // 路径
int CalMin(PathList path)
{
int min = 2000000000;
for(PathList::iterator begin=path.begin();begin!=path.end();++begin)
{
if(Map[begin->s][begin->t]<min)
min = Map[begin->s][begin->t];
}
return min;
}
bool FindPath(int &min,PathList &path,const int source,const int target)
{
bool used[MAXN][MAXN];
memset(used,0,sizeof(used));
queue<PathList> search_list;
PathList t;
Path p;
p.s = source;
t.push_back(p);
search_list.push(t);
while(!search_list.empty())
{
t = search_list.front();
search_list.pop();
for(int i=1;i<=n;++i)
{
if(Map[t.back().s][i]>0 && !used[t.back().s][i])
{
used[t.back().s][i] = true;
PathList temp(t);
temp.back().t = i;
if(temp.back().t == target)
{
min = CalMin(temp);
path = temp;
return true;
}
p.s = i;
temp.push_back(p);
search_list.push(temp);
}
}
}
return false;
}
int main()
{
int m;
while(cin>>m>>n)
{
memset(Map,0,sizeof(Map));
int s,e,c;
for(int i=0;i<m;++i)
{
cin>>s>>e>>c;
Map[s][e] += c;
}
int sum=0,min;
PathList path;
while(FindPath(min,path,1,n)) // 1为源点,n为汇点
{
sum += min;
Path temp;
while(!path.empty())
{
temp = path.front();
path.pop_front();
Map[temp.s][temp.t] -= min;
Map[temp.t][temp.s] += min;
}
}
cout<<sum<<endl;
}
return 0;
}
#include <iostream>
#include <deque>
#include <queue>
using namespace std;
#define MAXN 201
int Map[MAXN][MAXN],n;
typedef struct __Path
{
int s,t;
}Path; // 路
typedef deque<Path> PathList; // 路径
int CalMin(PathList path)
{
int min = 2000000000;
for(PathList::iterator begin=path.begin();begin!=path.end();++begin)
{
if(Map[begin->s][begin->t]<min)
min = Map[begin->s][begin->t];
}
return min;
}
bool FindPath(int &min,PathList &path,const int source,const int target)
{
bool used[MAXN][MAXN];
memset(used,0,sizeof(used));
queue<PathList> search_list;
PathList t;
Path p;
p.s = source;
t.push_back(p);
search_list.push(t);
while(!search_list.empty())
{
t = search_list.front();
search_list.pop();
for(int i=1;i<=n;++i)
{
if(Map[t.back().s][i]>0 && !used[t.back().s][i])
{
used[t.back().s][i] = true;
PathList temp(t);
temp.back().t = i;
if(temp.back().t == target)
{
min = CalMin(temp);
path = temp;
return true;
}
p.s = i;
temp.push_back(p);
search_list.push(temp);
}
}
}
return false;
}
int main()
{
int m;
while(cin>>m>>n)
{
memset(Map,0,sizeof(Map));
int s,e,c;
for(int i=0;i<m;++i)
{
cin>>s>>e>>c;
Map[s][e] += c;
}
int sum=0,min;
PathList path;
while(FindPath(min,path,1,n)) // 1为源点,n为汇点
{
sum += min;
Path temp;
while(!path.empty())
{
temp = path.front();
path.pop_front();
Map[temp.s][temp.t] -= min;
Map[temp.t][temp.s] += min;
}
}
cout<<sum<<endl;
}
return 0;
}