码迷,mamicode.com
首页 > 其他好文 > 详细

2017-2018OI学习记录

时间:2017-11-19 11:16:21      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:距离   16px   div   12px   color   mes   floyd   ons   不同   

$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学习记录

标签:距离   16px   div   12px   color   mes   floyd   ons   不同   

原文地址:http://www.cnblogs.com/TheRoadToAu/p/7859021.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!