POJ 2195 Going Home 最小费用最大流

2014-11-24 08:11:18 · 作者: · 浏览: 1
最小费用最大流:

还是主要寻找个增广路,用spfa寻找增广路。

邻接表存。

这是个模板题:

构图的话,设置一个超级源点,超级汇点,再人一个集合,房子一个集合,在任何每个房子间连一条流量为1,费用为距离的边,超级源点和人连 流量为1,费用为0,,房子和超级汇点间也同样连边。

#include
  
   
#include
   
     #include
    
      #include
     
       #include
      
        using namespace std; const int maxn=1000,maxm=100000,inf=1<<26; struct Edge { Edge(){}; Edge(int a,int b,int c,int d) {v=a; f=b; w=c; nxt=d;} int v,f,w,nxt; }; struct point { int x,y; } hh[300],mm[300]; int g[maxn+10]; struct Edge e[maxm+10]; int nume; int src,sink; char Map[300][300]; queue
       
        que; bool inQue[maxn+10]; int dist[maxn+10]; int pree[maxn+10],prev[maxn+10]; void add(int u,int v,int f,int w) { e[++nume] = Edge(v,f,w,g[u]); g[u]=nume; e[++nume] = Edge(u,0,-w,g[v]); g[v]=nume; } bool findPath() { while(!que.empty()) que.pop(); que.push(src); int i; //memeset(dist,63,sizeof(dist)); for(i=0;i<=sink+10;i++) dist[i]=inf; dist[src]=0; inQue[src]=true; while(!que.empty()){ int u=que.front(); que.pop(); for(i = g[u]; i ; i=e[i].nxt){ if(e[i].f>0&&dist[u]+e[i].w