当前位置:编程学习 > C/C++ >>

poj-2516-Minimum Cost-最小费用最大流

这道题目分别求每一商品的最小费用,然后加起来就可以了。

但是调试了很久,郁闷,好多地方写的不对。也许是自己没看模版的原因。

记住:

1,反向边初始化为0;

2,spfa的标记。

3,初始化。


[html]
#include<stdio.h> 
#include<iostream> 
#include<string.h> 
#include<algorithm> 
#include<queue> 
#include<stack> 
#include<stdlib.h> 
#define INT_MAX 0x7fffffff 
#define INF 999999 
#define max3(a,b,c) (max(a,b)>c?max(a,b):c) 
#define min3(a,b,c) (min(a,b)<c?min(a,b):c) 
#define mem(a,b) memset(a,b,sizeof(a)) 
using namespace std; 
struct node 

    int u; 
    int v; 
    int next; 
    bool friend operator < (node a, node b){ 
        return a.u< b.u; 
    } 
}edge[100001]; 
int head[1000010]; 
int 易做图(int n,int m){if(n<m) swap(n,m);return n%m==0?m:易做图(m,n%m);} 
int lcm(int n,int m){if(n<m) swap(n,m);return n/易做图(n,m)*m;} 
int n,m,k; 
int need[101][101];//第i个店主对物品j的需求; 
int give[101][101];//第i个供货商对物品j的供货能力; 
int fei[101][101][101];//i,j,k;第k个物品,供货商j对店主i的费用 
int cost[501][501]; 
int p[1001]; 
int num=0; 
void add(int l,int r,int v) 

    edge[num].u=r; 
    edge[num].v=v; 
    edge[num].next=head[l]; 
    head[l]=num; 
    num++; 

int spfa() 

    int visit[100001]; 
    int i,dist[10001]; 
    memset(visit,0,sizeof(visit)); 
    memset(p,-1,sizeof(p)); 
    queue<int>q; 
    for(i=0;i<=n+m+1;i++)dist[i]=INF; 
    dist[0]=0; 
    q.push(0); 
    visit[0]=1; 
    while(!q.empty()) 
    { 
        int e; 
        e=q.front(); 
        q.pop(); 
        visit[e]=0; 
        //printf("tan->%d\n",e); 
        for(i=head[e];i!=-1;i=edge[i].next) 
        { 
            int r=edge[i].u; 
           // printf("%d %d %d %d %d\n",e,r,dist[e],dist[r],edge[i].v); 
            if(dist[r]>dist[e]+edge[i].v&&cost[e][r]) 
            { 
                p[r]=e; 
                dist[r]=dist[e]+edge[i].v; 
                //printf("----p[%d]=%d\n",r,e); 
                if(!visit[r]) 
                { 
                    visit[r]=1; 
                    q.push(r); 
                  //  printf("%d\n",r); 
                } 
            } 
        } 
        //visit[e]=1; 
 
    } 
    if (dist[n+m+1] == INF) return false; 
    return true; 
    //if(p[n+m+1]!=-1)return 1; 
    //return 0; 

void zeng() 

   // puts("sf"); 
    int minl; 
    minl=INF; 
    int i; 
    for(i=n+m+1;p[i]!=-1;i=p[i]) 
    { 
        minl=min(minl,cost[p[i]][i]); 
        //printf("p[%d]=%d\n",i,p[i]); 
    } 
   // printf("%d\n",minl); 
    for(i=n+m+1;p[i]!=-1;i=p[i]) 
    { 
        int j=p[i]; 
     //   printf("cost[%d][%d]=%d\n",j,i,cost[j][i]); 
        cost[j][i]-=minl; 
        cost[i][j]+=minl; 
       // printf("cost[%d][%d]=%d\n",j,i,cost[j][i]); 
    } 

int main() 

    int i,j,kk; 
    while(scanf("%d%d%d",&n,&m,&k)&&(n||m||k)) 
    { 
        mem(cost,0); 
        mem(head,-1); 
        num=0; 
        for(i=1;i<=n;i++) 
        { 
            for(j=1;j<=k;j++) 
            { 
                scanf("%d",&need[i][j]); 
            } 
        } 
        for(i=1;i<=m;i++) 
        { 
            for(j=1;j<=k;j++) 
            { 
                scanf("%d",&give[i][j]); 
            } 
        } 
        for(kk=1;kk<=k;kk++) 
        { 
      &n

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,