poj2135 mcmf 最小费用最大流(模版测试题)

直接练习自己模版写的怎么样?

#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#include<queue>
const int inf=0x3f3f3f3f;
const int maxn=1005;
const int maxm=maxn*40;
int head[maxn];
struct notes{
    int v,c,f,next;
}a[maxm];
int coun;
bool used[maxn];
int path[maxn];
int dis[maxn];
int q[maxn];
int n,m;
int ans;

void add(int u,int v,int f,int c){
    a[coun].v=v;
    a[coun].c=c;
    a[coun].f=f;
    a[coun].next=head[u];
    head[u]=coun;
    coun++;
    a[coun].v=u;
    a[coun].c=-c;
    a[coun].f=0;
    a[coun].next=head[v];
    head[v]=coun;
    coun++;
}

bool spfa(){
    memset(path,-1,sizeof(path));
    queue<int>que;
    while(!que.empty()){
        que.pop();
    }
    memset(dis,inf,sizeof(dis));//现标记为最大值 
    memset(used,false,sizeof(used));
    que.push(0);
    path[0]=0;
    dis[0]=0;//入队前需要赋值0 
    used[0]=true;
    while(!que.empty()){
        int t=que.front();
        que.pop();
        used[t]=false;
        for(int i=head[t];i!=-1;i=a[i].next){//下一个
            int v=a[i].v,c=a[i].c;
            if(a[i].f>0&&(dis[v]>c+dis[t])){//如果流量还有的话,并且费用可以更新 
                dis[v]=c+dis[t];
                path[v]=t;///i
                q[v]=i;//这里用一个数组保存下来 
                if(!used[v]){
                    used[v]=true;//加入队列需要标记 
                    que.push(v);
                }
            }
        }
    }
    if(path[n]==-1)return false;
    return true;
} 

void mcmf(){
    while(spfa()){
        int min_=inf+1;
        for(int i=n;i!=0;i=path[i]){//直接从n到1就可以,0-1,n-n+1不用管 
            min_=min(min_,a[q[i]].f);//取流量的最小值 
        }
        for(int i=n;i!=0;i=path[i]){//直接从n到1就可以,0-1,n-n+1不用管 
            a[q[i]].f-=min_;///流量减少 这里的q[i]的意思是虽然是i这个点,但是i这个点有很多边,到底是哪一条,你需要记录下来 
            a[q[i]^1].f+=min_;//反向边流量增加 
        }
        ans+=dis[n]*min_;
    }
}

int main(){
    //freopen("2135.txt","r",stdin);
    while(scanf("%d%d",&n,&m)!=-1){
        coun=0;
        memset(head,-1,sizeof(head));
        while(m--){
            int u,v,c;
            scanf("%d%d%d",&u,&v,&c);
            add(u,v,1,c);
            add(v,u,1,c);
        }
        add(0,1,2,0);
        add(n,n+1,2,0);
        ans=0;
        mcmf();
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(poj2135 mcmf 最小费用最大流(模版测试题))