$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%。
时间: 2024-11-05 12:17:49