1. 程式人生 > >2017-2018OI學習記錄

2017-2018OI學習記錄

ems 最短路 void queue 一次 clu 最短 sizeof empty

$Mingqi_H$

NOIp 2017考掛了...gg

重新開始好了。

計劃明年2月24號前復習完所有的NOIp知識點(畢竟很不熟練啊),之後到七月底前學習完省選的東西(flag?)。

從現在開始吧。

11.29 NOIp圖論(Ⅰ)

坑:Floyd、Dijkstra、最短路計數、Tarjan、二分圖、拓撲。

最短路計數:

#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e5+10;
struct Edge{int
u,v,w;}edge[2*maxn];int head[maxn],cnt; void add(int u,int v,int w){edge[++cnt].u=head[u],edge[cnt].v=v,edge[cnt].w=w,head[u]=cnt;} int dis[maxn],vis[maxn]; int ans[maxn]; inline void spfa(int s) { queue<int>q;int cur,nxt; memset(dis,0x7f,sizeof(dis)),memset(vis,0,sizeof(vis)); dis[s]
=0,vis[s]=1,q.push(s); ans[s]=1; while(!q.empty()) { cur=q.front(),vis[cur]=0,q.pop(); for(int i=head[cur];i;i=edge[i].u) { nxt=edge[i].v; if(!ans[nxt])ans[nxt]=ans[cur],dis[nxt]=dis[cur]+edge[i].w,q.push(nxt); else if(dis[nxt]==dis[cur]+edge[i].w)ans[nxt]+=ans[cur],ans[nxt]%=
mod; } } }

類似一個標準的SPFA,不同之處在於加粗的兩句:

  • 如果第一次到達nxt節點,nxt節點的最短路數量就等於其前驅節點的最短路數量,更新一波距離,丟到隊列裏。
  • 否則當到nxt的最短路長度等於到其前驅節點的最短路+當前邊的權值時,到nxt節點的最短路數量應該加上到其前驅節點的最短路數量(再次更新)。

例題:洛谷P1144,P1608,P3953前30%。

2017-2018OI學習記錄