[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;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 十个月小孩吐了怎么办 10个月宝宝呕吐怎么办 小孩又拉又吐的怎么办 小孩子不吃饭呕吐拉肚子怎么办 小孩发烧后又吐怎么办 11个月宝宝吐了怎么办 11个月宝宝拉肚子怎么办 2岁宝宝反复呕吐怎么办 1岁半幼儿拉肚子怎么办 宝宝打嗝呕吐胃难受怎么办 3岁宝宝发烧还吐怎么办 孩子喝水都吐怎么办啊 宝宝吃多了呕吐怎么办 3岁宝宝吐怎么办才好 儿童受凉肚子疼发热呕吐怎么办 两岁宝宝半夜呕吐怎么办 两岁宝宝吐了怎么办 2岁宝宝发烧吐怎么办 2岁多宝宝呕吐是怎么办 2周岁宝宝中暑了怎么办 2岁半宝宝着凉呕吐怎么办 3岁宝宝吐了几次怎么办 一岁宝宝恶心吐怎么办 9个月宝宝一直吐怎么办 晚上冻着了呕吐怎么办 2岁宝宝一直吐怎么办 两岁宝宝门牙龋齿怎么办 两岁宝宝得龋齿怎么办 两岁宝宝长龋齿怎么办 宝宝2岁不吃饭怎么办 两岁宝宝总是吐怎么办 3岁儿童受凉呕吐怎么办 两岁宝宝四天没拉大便怎么办 两岁宝宝发烧吐怎么办 四岁宝宝吐了怎么办啊 3岁宝宝突然吐了怎么办 宝宝撑着了吐拉怎么办 2岁宝宝体温37.5怎么办 宝宝2岁乳牙烂了怎么办 孕40周还没入盆怎么办 孕妇脸上长斑了怎么办