Hdu Drainage Ditches

1 /* 2 http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1001&ojid=0&cid=4456&hide=0 3 4 hdu Drainage Ditches 5 */ 6 #include <iostream> 7 #include<cstdio> 8 #include<cstring> 9 #include<vector> 10 #include<queue> 11 #include<algorithm> 12 using namespace std; 13 #define min(a,b) ((a)<(b))?(a):(b) 14 #define max(a,b) ((a)>(b))?(a):(b) 15 #define MAXN 200 16 #define MAXM 500 17 #define INF 0x3f3f3f3f 18 //链式前向星 19 struct enode 20 { 21 int t; 22 int w; //权值 23 int c; //流量 24 // int cost; 25 // int pre; //前向指针 26 int next; 27 }; 28 struct lstar 29 { 30 struct enode e[MAXM]; 31 int box[MAXN],ecnt; 32 //int etail[MAXN]; //尾部 33 void init() 34 { 35 ecnt=0; 36 memset(box,-1,sizeof(box)); 37 // memset(etail,-1,sizeof(etail)); //初始化尾部 38 } 39 void ins(int f,int t,int c) //简单 40 { 41 e[ecnt].t=t; 42 // e[ecnt].pre=-1; 43 e[ecnt].next=box[f]; 44 e[ecnt].c=c; 45 box[f]=ecnt++; 46 } 47 void addedge(int f,int t,int c) //流量重载 48 { 49 e[ecnt].next=box[f]; 50 e[ecnt].t=t; 51 e[ecnt].c=c; 52 box[f]=ecnt++; 53 e[ecnt].next=box[t]; 54 e[ecnt].t=f; 55 e[ecnt].c=0; 56 box[t]=ecnt++; 57 } 58 void ins1(int f,int t,int w) //权值重载 59 { 60 e[ecnt].t=t; 61 e[ecnt].w=w; 62 e[ecnt].next=box[f]; 63 box[f]=ecnt++; 64 } 65 66 }; 67 68 int sap(int s,int t,lstar G,int N)//最大流问题 69 { 70 int gap[MAXN],lvl[MAXN],cur[MAXN],pre[MAXN]; 71 int curflow,ans=0,u,tmp,neck,i; 72 memset(lvl,0,sizeof(lvl)); 73 memset(gap,0,sizeof(gap)); 74 memset(pre,-1,sizeof(pre)); 75 for(i=0;i<N;i++) 76 cur[i]=G.box[i]; 77 gap[0]=N; 78 u=s; 79 while(lvl[s]<N) 80 { 81 if(u==t) 82 { 83 curflow=INF; 84 for(i=s;i!=t;i=G.e[cur[i]].t) 85 { 86 if(curflow>G.e[cur[i]].c) 87 { 88 neck=i; 89 curflow=G.e[cur[i]].c; 90 } 91 } 92 for(i=s;i!=t;i=G.e[cur[i]].t) 93 { 94 tmp=cur[i]; 95 G.e[tmp].c-=curflow; 96 G.e[tmp^1].c+=curflow; 97 } 98 ans+=curflow; 99 u=neck; 100 } 101 for(i=cur[u];i!=-1;i=G.e[i].next) 102 if(G.e[i].c && lvl[u]==lvl[G.e[i].t]+1) 103 break; 104 if(i!=-1) 105 { 106 cur[u]=i; 107 pre[G.e[i].t]=u; 108 u=G.e[i].t; 109 } 110 else 111 { 112 if(--gap[lvl[u]]==0) 113 break; 114 cur[u]=G.box[u]; 115 for(tmp=N,i=G.box[u];i!=-1;i=G.e[i].next) 116 if(G.e[i].c) 117 tmp=min(tmp,lvl[G.e[i].t]); 118 lvl[u]=tmp+1; 119 gap[lvl[u]]++; 120 if(u!=s) 121 u=pre[u]; 122 } 123 } 124 return ans; 125 } 126 int main() 127 { 128 int m,n; 129 lstar s; 130 while(cin>>n>>m) 131 { 132 int a,b,cost; 133 // memset(map,0,sizeof(map)); 134 s.init(); 135 for(int i=0;i<n;i++) 136 { 137 cin>>a>>b>>cost; 138 s.addedge(a-1,b-1,cost); 139 }//参数含义:源点 汇点 网络结点数量 140 //printf("####\n"); 141 /* for(int i=1;i<=n;i++) 142 { 143 for(int k=s.box[i];k!=-1;k=s.e[k].next) 144 cout<<i<< " " <<s.e[k].t<< " " <<s.e[k].c<<endl; 145 }//*/ 146 cout<<sap(0,m-1,s,m)<<endl;//最大流问题 147 } 148 return 0; 149 }
图论 基础 求最大流
建图 链式前向星 注意构建边结构 存容量 C
SAP 求最大流
posted on 2013-04-18 22:57 ACM_Someone like you 阅读(209) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)