设为首页 加入收藏

TOP

POJ 2135 Farm Tour 最小费用最大流(二)
2012-11-10 11:52:00 来源: 作者: 【 】 浏览:526
Tags:POJ  2135  Farm  Tour  最小 费用 最大


    
    所有路径的费用之和就是总的最小费用。
   
    */
   
    void AddEdge(int u,int v,int p,int f)
   
    {
   
    e[size]=Edge(v,p,f,head[u]);
   
    head[u]=size++;
   
    e[size]=Edge(u,-p,0,head[v]);
   
    head[v]=size++;
   
    }
   
    bool SPFA(int s,int t,int n)
   
    {
   
    int f,u,v,i;
   
    queue<int> que;
   
    while( !que.empty()) que.pop();
   
    memset(vis,0,sizeof(vis));
   
    memset(dist,0x7f,sizeof(dist));
   
    memset(pre,-1,sizeof(pre));
   
    que.push(s), vis[s]=true, dist[s]=0;
   
    while( !que.empty()){
   
    u=que.front();
   
    que.pop(), vis[u]=false;
   
    for( i=head[u];i!=-1;i=e[i].next){
   
    v=e[i].v;
   
    if( e[i].f&&dist[v]>dist[u]+e[i].p){
   
    dist[v]=dist[u]+e[i].p;
   
    pre[v]=u;
   
    cur[v]=i;
   
    /* pre,cur数组记录路径*/
   
    if( !vis[v]){
   
    que.push(v);
   
    vis[v]=1;
   
    }
   
    }
   
    }
   
    }
   
    if(pre[t]==-1) return false;
   
    return true;
   
    }
   
    void Update(int u)  //在找到的 最小费用增广路径上修改流量
   
    {
   
    if(pre[u]==-1) return ;
   
    if( mimf>e[cur[u]].f) mimf=e[cur[u]].f;
   
    Update(pre[u]);
   
    e[cur[u]].f-=mimf;
   
    e[cur[u]^1].f+=mimf;
   
    }
   
    int main()
   
    {
   
    int n,m,a,b,c,ans;
   
    scanf(“%d%d”,&n,&m);
   
    memset(head,-1,sizeof(head));
   
    size=0;
   
    while( m--){
   
    scanf(“%d%d%d”,&a,&b,&c);
   
    AddEdge(a,b,c,1);   //因为是无向图,将两条边。
   
    AddEdge(b,a,c,1);
   
    }
   
    AddEdge(0,1,0,2);
   
    AddEdge(n,n+1,0,2);
   
    ans=0;
   
    while( SPFA(0,n+1,n)){
   
    mimf=INF;
   
    Update(n+1);
   
    ans+=mimf*dist[n+1];
   
    }
   
    printf(“%d\n”,ans);
   
    return 0;
   
    }

      

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇多重背包+二进制优化 下一篇一个简易画板的实现(Graphics..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: