POJ 2195 - Going Home 更新最小费用最大流模板..整合成结构体...
来源:互联网 发布:家居设计软件有哪些 编辑:程序博客网 时间:2024/04/27 07:07
Ps...我发现现在这个代码怎么优化还是没有以前写的那个快..以前那个还是用的临接矩阵..真是蛋疼....不过也够用了...
Program:
#include<iostream>#include<stdio.h>#include<string.h>#include<cmath>#include<queue>#include<stack>#include<set>#include<time.h>#include<map>#include<algorithm>#define ll long long#define eps 1e-5#define oo 1000000007#define pi acos(-1.0)#define MAXN 250#define MAXM 500005using namespace std;char S[110][110];int H[110],M[110];struct MCMF{ struct node { int x,y,c,v,next; }line[MAXM]; int Lnum,_next[MAXN],pre[MAXN],dis[MAXN],flow,cost; bool inqueue[MAXN]; void initial(int n) { Lnum=-1; for (int i=0;i<=n;i++) _next[i]=-1; } void addline(int x,int y,int c,int v) { line[++Lnum].next=_next[x],_next[x]=Lnum; line[Lnum].x=x,line[Lnum].y=y,line[Lnum].c=c,line[Lnum].v=v; line[++Lnum].next=_next[y],_next[y]=Lnum; line[Lnum].x=y,line[Lnum].y=x,line[Lnum].c=0,line[Lnum].v=-v; } bool SPFA(int s,int e) { int x,k,y; queue<int> Q; while (!Q.empty()) Q.pop(); memset(dis,0x7f,sizeof(dis)); memset(inqueue,false,sizeof(inqueue)); Q.push(s); dis[s]=0,pre[s]=-1; while (!Q.empty()) { x=Q.front(),Q.pop(),inqueue[x]=false; for (k=_next[x];k!=-1;k=line[k].next) if (line[k].c) { y=line[k].y; if (dis[y]>dis[x]+line[k].v) { dis[y]=dis[x]+line[k].v; pre[y]=k; if (!inqueue[y]) { inqueue[y]=true; Q.push(y); } } } } if (dis[e]>oo) return false; flow=oo,cost=0; for (k=pre[e];k!=-1;k=pre[line[k].x]) flow=min(flow,line[k].c),cost+=line[k].v; cost*=flow; for (k=pre[e];k!=-1;k=pre[line[k].x]) line[k].c-=flow,line[k^1].c+=flow; return true; } int MinCostMaxFlow(int s,int e) { int Aflow=0,Acost=0; while (SPFA(s,e)) { Aflow+=flow; Acost+=cost; } return Acost; }}T;int main(){ int R,C,i,j,k,n,m,s,e; freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); while (~scanf("%d%d",&R,&C) && (R || C)) { for (i=0;i<R;i++) scanf("%s",S[i]); n=m=0; for (i=0;i<R;i++) for (j=0;j<C;j++) { if (S[i][j]=='m') M[++n]=i*C+j; if (S[i][j]=='H') H[++m]=i*C+j; } s=n+m+1,e=s+1,T.initial(e); for (i=1;i<=n;i++) T.addline(s,i,1,0); for (i=1;i<=m;i++) T.addline(i+n,e,1,0); for (i=1;i<=n;i++) for (j=1;j<=m;j++) T.addline(i,j+n,1,abs(M[i]/C-H[j]/C)+abs(M[i]%C-H[j]%C)); printf("%d\n",T.MinCostMaxFlow(s,e)); } return 0;}
- POJ 2195 - Going Home 更新最小费用最大流模板..整合成结构体...
- POJ 2195 Going Home -- 最小费用最大流模板
- poj-2195-Going Home(最小费用最大流模板题)
- POJ 2195 Going Home 最小费用最大流(模板题)
- Going Home(最小费用最大流模板)
- poj-2195-Going Home最小费用最大流
- poj - 2195 - Going Home(最小费用最大流)
- hdu 1533 || poj 2195 Going Home (最小费用最大流)
- POJ 2195 Going Home 最小费用最大流
- POJ 2195 Going Home 最小费用最大流
- poj 2195 Going Home(最小费用最大流)
- POJ 2195 Going Home (最小费用最大流)
- 【最小费用最大流】POJ-2195 Going Home
- POJ 2195 & HDU 1533 Going Home(最小费用最大流)
- poj 2195 Going Home(最小费用最大流)
- poj 2195 Going Home【最小费用最大流】
- Going Home POJ 2195 (最小费用最大流)
- POJ 2195 Going Home (最小费用最大流)
- ARM Linux (S3C6410架构…
- ARM1176JZF-S/S3C6410 内存地…
- ARM1176JZF-S/S3C6410处理器的操作…
- ARM Linux系统中的用户栈与内核栈
- 数据摘要算法的测试效率(SHA、MD5和CRC32)
- POJ 2195 - Going Home 更新最小费用最大流模板..整合成结构体...
- ARM Linux (S3C6410架构…
- ARM Linux (S3C6410架构…
- jQuery一个元素绑定多个相同事件的解决
- ARM1176JZF-S/S3C6410处理器的异常…
- 简单工厂模式/Simple Factory
- 工厂方法模式/Factory Method
- 抽象工厂模式/Abstract Factory
- 单例模式/Singleton