您的位置:首页 > 其它

POJ 1273

2015-06-09 13:53 330 查看
#include<iostream>
#include<stdio.h>
#define big_num 1000000000
#define MAXN 250
#include"queue"
using namespace std;

int _m[MAXN][MAXN];
int Ford_fulkerson(int m, int s, int t, int &F,int g[][MAXN]);
int find_path(int m, int s,int t,int pre[MAXN],int g[][MAXN]);

int main()
{
//freopen("acm.acm","r",stdin);
int p;
int s;
int i;
int j;
int w;
int m;
int n;
while(cin>>s>>p)
{
memset(_m,0,sizeof(_m));
//    memset(pre,0,sizeof(pre));
for(i = 0; i < s; ++ i)
{
cin>>m>>n;
cin>>w;
_m[m-1][n-1] += w;
}
int F = 0;
while(Ford_fulkerson(p,0,p-1,F,_m));
cout<<F<<endl;
}
system("PAUSE");
}
/////////////////////////////////////////////////////////////
//网络流(Ford_fulkerson算法)自己写的模板~
//#define big_num 1000000000
//#include"queue"
//int _m[MAXN][MAXN];
/////////////////////////////////////////////////////////////
int find_path(int m, int s,int t,int pre[MAXN],int g[][MAXN])
{
queue<int> q;
int * mark = new int[m];
memset(mark,0,sizeof(int)*m);
int x;
mark[s] = 1;
int i;
q.push(s);
while(!q.empty())
{
x = q.front();
for(i = 0; i < m; i++)
{
if(g[x][i] > 0 && mark[i] == 0)
{
mark[i] = 1;
pre[i] = x;
if(i == t)
return 1;
q.push(i);
}
}
q.pop();
}
delete [] mark;
return 0;
}
int Ford_fulkerson(int n, int s, int t, int &F,int g[][MAXN])
{
int i;
int min;
int * pre = new int
;
if(find_path(n,s,t,pre, g) == 0)
{
delete [] pre;
return 0;
}
min = big_num;
for(i = t; i != s; i = pre[i])
if(g[pre[i]][i] < min)
{
min = g[pre[i]][i];
}
for(i = t; i != s; i = pre[i])
{
g[pre[i]][i] -= min;
g[i][pre[i]] += min;
}
F += min;
delete []pre;
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: