卡了一晚上啊

首先我们要跑一边整张图的spfa,记录每个点是从哪条边出去的(pre数组)

这里记录的不是前驱边,而是和原点相连的第一个点编号,因为不能走重复边所以才要记录这个,以免刚刚出去又原路返回

那么有一个朴素思路:spfa每一个1点连出去的点

事实上这样是会T的。。。

从这里改进,我们发现上面那种方法走了很多重复的工作,每一次spfa其实是非常类似的

那么我们可以优化一下这个过程:建一张新图跑spfa

这张新图这样建:建立新汇点n+1,设当前边(u,v,w)

1.原点连出的{

pre[v]!=v的话,连1,v,w

否则不连

}

2.连向原点的{

pre[u]!=u 直接用dis[u]+w更新答案

否则连u,n+1,w

}

3.其他的,如果pre[u]==pre[v]从一到v建dis[u]+w的边

否则保留原边

那么新图的最短路就是答案

某个T掉了的

//Copyright(c)2015 liuchenrui
#include<cstdio>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<cstring>
#define o(e) ((((e)-1)^1)+1)
#define inc(a) a++;if(a==100000)a=1;
#define inf 1000000000
using namespace std;
inline void splay(int &v){v=0;char c=0;int p=1;while(c<'0' || c>'9'){if(c=='-')p=-1;c=getchar();}while(c>='0' && c<='9'){v=(v<<3)+(v<<1)+c-'0';c=getchar();}v*=p;
}
struct Edge{int to,next,len;
}edge[200010];
int first[100010],size;
int dis[40010],dl[100010];
bool exsit[40010];
void addedge(int x,int y,int z){size++;edge[size].to=y;edge[size].next=first[x];first[x]=size;edge[size].len=z;
}
int head,tail;
int spfa(int now,int lim){head=0,tail=1;memset(dis,63,sizeof dis);dis[now]=0,dl[1]=now;while(head!=tail){inc(head);int v=dl[head];exsit[v]=false;for(int u=first[v];u;u=edge[u].next){if(edge[u].len+dis[v]<dis[edge[u].to] && u!=lim){dis[edge[u].to]=edge[u].len+dis[v];if(!exsit[edge[u].to]){exsit[edge[u].to]=true;inc(tail);dl[tail]=edge[u].to;}}}}return dis[1];
}
int main(){freopen("xxx.in","r",stdin);freopen("xxx.out","w",stdout);int n,m;splay(n),splay(m);for(int i=1;i<=m;i++){int s,e,l,r;splay(s),splay(e),splay(l),splay(r);addedge(s,e,l);addedge(e,s,r);}int ans=inf;for(int u=first[1];u;u=edge[u].next){ans=min(ans,spfa(edge[u].to,o(u))+edge[u].len);}cout<<ans<<endl;
}

A了的

//Copyright(c)2015 liuchenrui
#include<cstdio>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<cstring>
#define o(e) ((((e)-1)^1)+1)
#define inc(a) a++;if(a==100000)a=1;
#define inf 1000000000
using namespace std;
inline void splay(int &v){v=0;char c=0;int p=1;while(c<'0' || c>'9'){if(c=='-')p=-1;c=getchar();}while(c>='0' && c<='9'){v=(v<<3)+(v<<1)+c-'0';c=getchar();}v*=p;
}
struct Edge{int to,next,len,from;
}edge[300010],e[300010];
int first[100010],size;
int dis[40010],dl[100010];
bool exsit[40010];
int pre[40010];
int f[40010],s;
int n,m;
void addedge(int x,int y,int z){size++;edge[size].to=y;edge[size].next=first[x];first[x]=size;edge[size].len=z;edge[size].from=x;
}
void add(int x,int y,int z){s++;e[s].to=y;e[s].next=f[x];f[x]=s;e[s].len=z;fprintf(stderr,"%d %d %d\n",x,y,z);
}
int head,tail,ans=inf;
void spfa(){while(head!=tail){inc(head);int v=dl[head];exsit[v]=false;for(int u=first[v];u;u=edge[u].next){if(edge[u].len+dis[v]<dis[edge[u].to]){dis[edge[u].to]=edge[u].len+dis[v];pre[edge[u].to]=pre[v];if(!exsit[edge[u].to]){exsit[edge[u].to]=true;inc(tail);dl[tail]=edge[u].to;}}}}
}
int Spfa(){memset(dis,63,sizeof dis);head=0,tail=1;dis[1]=0;dl[1]=1;while(head!=tail){inc(head);int v=dl[head];exsit[v]=false;for(int u=f[v];u;u=e[u].next){if(e[u].len+dis[v]<dis[e[u].to]){dis[e[u].to]=e[u].len+dis[v];if(!exsit[e[u].to]){exsit[e[u].to]=true;inc(tail);dl[tail]=e[u].to;}}}}return dis[n+1];
}
int main(){freopen("xxx.in","r",stdin);freopen("xxx.out","w",stdout);splay(n),splay(m);for(int i=1;i<=m;i++){int s,e,l,r;splay(s),splay(e),splay(l),splay(r);if(s==e&&s==1){ans=min(ans,l),ans=min(ans,r);}else addedge(s,e,l),addedge(e,s,r);}memset(dis,63,sizeof dis);for(int u=first[1];u;u=edge[u].next){dl[++tail]=edge[u].to;exsit[edge[u].to]=true;pre[edge[u].to]=edge[u].to;dis[edge[u].to]=edge[u].len;}spfa();for(int i=1;i<=size;i++){if(edge[i].to==1){if(edge[i].from==pre[edge[i].from]){add(edge[i].from,n+1,edge[i].len);}else{ans=min(ans,dis[edge[i].from]+edge[i].len);}}else if(edge[i].from==1){if(pre[edge[i].to]!=edge[i].to){add(1,edge[i].to,edge[i].len);}}else{if(pre[edge[i].from]==pre[edge[i].to]){add(edge[i].from,edge[i].to,edge[i].len);}else{add(1,edge[i].to,dis[edge[i].from]+edge[i].len);}}}cout<<Spfa()<<endl;
}

bzoj 4398 福慧双修 题解相关推荐

  1. BZOJ 2407: 探险/BZOJ 4398: 福慧双修 dijkstra 构造

    2407: 探险 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 170  Solved: 95 [Submit][Status][Discuss] ...

  2. bzoj 4398 福慧双修——二进制分组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 如果枚举1号点走哪些点出去,就从那些点出发跑多源最短路即可.最短路不会重复经过一条边. ...

  3. bzoj 4398: 福慧双修(最短路建模/构造)

    简述题意: 给定一个有向图,对于连接同两个点的边算作同一条,问不经过重复边的最小正权环. 保证没有重边(这个是指有向的),没有自环. 算法:最短路+构造 难度:NOIP+ 题解: 有一种暴力的思路,感 ...

  4. bzoj 4398 福慧双修 —— 二进制分组+多起点最短路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 按二进制每一位是 0/1 把 1 号点的儿子分成两组,分别作为起点和终点跑多起点最短路 ...

  5. BZOJ 2407: 探险/4398: 福慧双修

    2407: 探险 Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明 ...

  6. bzoj 4398:福慧双修

    学习了一下最短路的姿势,这个建图方法好妙啊,虽然不会证明正确性-- #include <bits/stdc++.h> #define N 220000 #define INF 100000 ...

  7. Bzoj 2064 分裂 题解

    2064: 分裂 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 570  Solved: 350 [Submit][Status][Discuss] ...

  8. BZOJ 3070 震波 题解

    题目传送门 题目大意: 有一棵 n n n 个带权点的树,所有边的长度都是 1 1 1,现在有两种操作.操作 1 1 1:询问 x x x 周围与它距离不超过 k k k 的点的权值和(包括自己):操 ...

  9. 【业界偷懒】【Public】BZOJ题目一句话题解整理

    转发[Hzwer]: 就当是复习一下自己做过的题,顺便提供一个简要题解给大家看. 做题时候实在想不出来看一下一句话题解,可以有一个提示的作用又不至于一下子知道了全部浪费了一道题吧.. 部分题目(如我A ...

最新文章

  1. torch.nn.BCELoss用法
  2. Redis Sentinel--运维管理
  3. Ubuntu1804和2004高版本,右键无法创建TXT文档的解决办法【未完待续】
  4. 【黑客免杀攻防】读书笔记14 - 面向对象逆向-虚函数、MFC逆向
  5. Java提高篇 —— Java三大特性之继承
  6. LoadRunner培训初级教程
  7. 我来重新学习 javascript 的面向对象(part 1)
  8. 如何判断模糊图像_深圳企业宣传片拍摄制作教你如何使用手动聚焦
  9. golang基础之三-字符串,时间,流程控制,函数
  10. SpringMVC——处理方法返回值的可选类型
  11. Android 开发 Camera2开发_3_处理预览和拍照偏暗问题
  12. Navicat premium for Mac 12 破解 纯手工
  13. C#之AutoCAD文本字体样式设置
  14. 资料分享:TI AM5708平台特点和典型应用
  15. 使用Enum.Prase及Enum.TryPrase时的注意事项
  16. 前端技术基础--笔记
  17. 哪一款蓝牙耳机音质最好?2023发烧级音质蓝牙耳机推荐
  18. Android源码学习------SystemUI(二)
  19. 加入NLP交流群和求职群
  20. 新冠“登陆”南极,中国极地科考“零感染”

热门文章

  1. 致我们终将组件化的web
  2. 区块链底层平台FISCO BCOS的网络压缩功能如何?
  3. #92 Backpack
  4. String.split()方法介绍
  5. Android内核模式下对当前进程的cred结构的获取方式
  6. 使用了flink官方示例,尽然提交任务后报错了
  7. mysql使用注意事项
  8. Python_Task05:字典、集合和序列
  9. 关于微信豆苹果(IOS)用户1比10充值方法
  10. 13场院士报告推动2022中国种子大会 国稻种芯百团计划行动