hdu 3549 Flow Problem(网络流增广路径主要算法)

来源:互联网 发布:投影仪怎么连接网络 编辑:程序博客网 时间:2024/05/16 17:18
//hdu 3549 Flow Problem(网络流增广路径主要算法)#include<iostream>#include<cstdio>#include<queue>#include<string.h>using namespace std;const int N=17;const int M=1100;const int Inf=100000000;int map[N][N];int pre[N];int n,m;int vis[N];int Min(int a,int b){    if(a<b)    {        return a;    }    return b;}void init(){    memset(map,0,sizeof(map));}void readmap(){    int a,b,c;    scanf("%d%d",&n,&m);    for(int i=0;i<m;i++)    {        scanf("%d%d%d",&a,&b,&c);        map[a][b]+=c;    }}//===========网络流增广路径主要算法========================bool bfs()//广搜{    memset(vis,0,sizeof(vis));    memset(pre,0,sizeof(pre));    queue<int> qu;    vis[1]=1;    qu.push(1);    while(!qu.empty())    {        int temp=qu.front();        qu.pop();        if(temp==n) return true;        for(int i=1;i<=n;i++)        {            if(!vis[i]&&map[temp][i]!=0)            {                qu.push(i);                pre[i]=temp;                vis[i]=1;            }        }    }    return false;}int MaxFlow(){    int maxflow=0;    while(bfs())    {        int minflow=Inf;        for(int i=n;i!=1;i=pre[i])        {            minflow=Min(minflow,map[pre[i]][i]);        }        for(int i=n;i!=1;i=pre[i])        {            map[pre[i]][i]-=minflow;            map[i][pre[i]]+=minflow;//这个要注意        }        maxflow+=minflow;    }    return maxflow;}//==============================================int main(){    int t;    scanf("%d",&t);    int k=1;    while(t--)    {        init();        readmap();        printf("Case %d: %d\n",k++,MaxFlow());    }    return 0;}

0 0