[sgu]185. Two shortest 网络流
来源:互联网 发布:nginx tomcat 子域名 编辑:程序博客网 时间:2024/06/18 15:50
我要疯啦~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
网上看见的解法都是spfa+最大流,我偏去搞最小费用最大流……
写完了觉得C++压代码就是爽……于是交,MLE,才看见空间4096K……
不死心瞎改,修改过程中反复出现了WA CE RE TLE MLE……
Edge结构体里全改short发现空间不超了,又开始RE……
然后发现有一个成员变量必须int,算了下3200+K 应该到3900K左右可以搞……交,MLE
发现因为有结构体好像也在吃空间,全改成纯数组,AC了……一共交28遍,历时9小时
现在想想貌似用临接矩阵就可以水过去了?总之题思路真的算不上难T_T只能说我太弱了,颓一个月的后果……
/* 两遍spfa显然过不了,反例想下也很好举…… 很容易能想到网络流建模,这方面还是比较水的…… 两种寻路方法 一种是先spfa再枚举找出来dist[a]+len(a,b)==dist[b]的边搞出来个“最短路图” 两条路径就是两道流,最大流很容易搞…… 另一种是最小费用最大流,建图也没什么可说的……不过网上不通行说明这么做效率有问题? 改进下应该其实算是两遍spfa的正确姿势吧,思路和朴素最大流相似,既然会走错路就加上回边 实现起来和mcmf还是有区别的,只进行两次1-n网络增广判断下两次增量是不是都一样 输出的话两种方法一样,直接dfs输出就行了*/#include <cstdio>#include <cstring>#include <cstdlib>const int N=401,M=320002,INF=999999999;struct Caf{int flow,cost;};int g[N],q[N],prep[N],pree[N],dist[N],flow[N],tot=1,ps,pt,n,m,next[M];short p[M],c[M],k[M];bool v[N];int min(int a,int b) {return a<b?a:b;}void add(int a,int b,int cc,int d) { tot++; p[tot]=b; c[tot]=cc; k[tot]=d; next[tot]=g[a]; g[a]=tot; tot++; p[tot]=a; c[tot]=0; k[tot]=-d; next[tot]=g[b]; g[b]=tot;}Caf spfa() { int head=0,tail=1; memset(v,false,sizeof(v)); prep[ps]=pree[ps]=0; for (int i=1; i<=N; i++) dist[i]=INF; dist[ps]=0; q[1]=ps; flow[ps]=INF; while (head!=tail) { v[q[head=head%N+1]]=false; for (int tmp=g[q[head]]; tmp; tmp=next[tmp]) if ((dist[p[tmp]]>dist[q[head]]+(int)k[tmp])&&c[tmp]) { dist[p[tmp]]=dist[q[head]]+(int)k[tmp]; prep[p[tmp]]=q[head]; pree[p[tmp]]=tmp; flow[p[tmp]]=min(flow[q[head]],c[tmp]); if (!v[p[tmp]]) v[q[tail=tail%N+1]=p[tmp]]=true; } } if (dist[pt]==INF) return (Caf){0,0}; for (int tmp=pt; tmp!=ps; tmp=prep[tmp]) c[pree[tmp]]-=flow[pt], c[pree[tmp]^1]+=flow[pt]; return (Caf){flow[pt],flow[pt]*dist[pt]};}Caf mcmf() {return spfa();}void print(int pt) { if (pt==n) {printf("%d\n",pt); return;} for (int tmp=g[pt]; tmp; tmp=next[tmp]) if ((c[tmp]==0)&&(tmp%2==0)) { printf("%d ",pt); c[tmp]=99; print(p[tmp]); return; }}int main() { memset(g,0,sizeof(g)); //=============== scanf("%d%d",&n,&m); while (m--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); add(a,b,1,c); add(b,a,1,c); } ps=1; pt=n; Caf t1=spfa(),t2=spfa(); if ((t1.flow==t2.flow==1)&&(t1.cost==t2.cost)) print(1),print(1); else puts("No solution"); //system("pause"); return 0;}
- [sgu]185. Two shortest 网络流
- sgu 185 Two shortest 网络流卡内存神题!!!!
- SGU 185 Two shortest 网络流+spfa+省内存
- sgu 185 Two shortest 最大流
- sgu 185 Two shortest
- SGU 185 Two shortest
- SGU 185 Two shortest 最短路删边优化内存+网络流
- SGU 185 Two shortest(最短路+最大流)
- SGU 185 Two shortest 最短路+最大流
- sgu 185 Two shortest(最短路+最大流)
- SGU 185 Two shortest 最短路+最小费用最大流 或者 最短路+最大流
- Double Shortest Paths 网络流
- 动态网络流 SGU 438
- SGU 326 Perspective ( 网络流 )
- SGU 326 Perspective(网络流)
- sgu-217 Two Cylinders
- sgu185:Two shortest(最短路+最大流+邻接矩阵)
- Ustc-1280 Finding shortest path 网络流
- javascript学习实录 之七(实现鼠标移动上去后表格颜色变化) -- 刘小小尘
- 适配器模式--设计模式
- 关于<不能成为专业软件测试人员的10大理由>的一些阐述
- lcs 最长公共子序列 O(nlogn)算法
- 关于我拍网的一次使用感受
- [sgu]185. Two shortest 网络流
- 给定RAND5,写出RAND7
- ubuntu下中文输入法的安装
- Android开发之自动完成
- 使用base64对图片的二进制进行编码,使其可以利用ajax进行显示
- linux命令
- C/C++取整函数ceil(),floor()
- 自定义 Yii CGridView Column 的显示
- 661 - Blowing Fuses