首页 > 其他分享 >最短路计数

最短路计数

时间:2023-03-13 18:57:57浏览次数:21  
标签:cnt 遍历 idx int 短路 st 计数 dis

/*
    边权值都为1,所以可以用BFS来做
记住 BFS 和 dikstra 都是满足拓扑序性质的,也就是说可以用二者解决图论中的dp问题,而spfa不满足拓扑序的性质
*/


#include<bits/stdc++.h>
using namespace std;

const int N=1e6+10,M=4e6+10,P=100003;

int n,m;
int h[N],e[M],ne[M],idx;
int cnt[N],dis[N];
bool st[N];
void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

/*

   其实st数组是不需要的,因为bfs中每个点第一次入队时的距离是最小的,而我们初始化dis为正无穷,所以如果dis[j]<dis[t]+1,即如果j能被t这个点更新,说明j这个点还没有入过队
*/
/*
   if(dis[j]>dis[t]+1)//第一次被遍历
     {
         dis[j]=dis[t]+1;
         cnt[j]=cnt[t];
         q.push(j);
      }
      else if(dis[j]==dis[t]+1)//被与遍历这个点的同一层的其他点遍历
       cnt[j]=(cnt[j]+cnt[t])%P;
*/
void bfs()
{
    memset(dis,0x3f,sizeof dis);
    queue<int> q;
    dis[1]=0,cnt[1]=1;
    st[1]=true;
    q.push(1);
    
    while(q.size())
    {
        int t=q.front();
        q.pop();
        for(int i=h[t];~i;i=ne[i])
        {
            int j=e[i];
            if(dis[j]==dis[t]+1)//不是第一次遍历了
            cnt[j]=(cnt[j]+cnt[t])%P;
            if(st[j]) continue;
            st[j]=true;
              //第一次被遍历
            dis[j]=dis[t]+1;
            cnt[j]=cnt[t];
            q.push(j);
        }
    }
}

int main()
{
    scanf("%d%d",&n,&m);
    
    memset(h,-1,sizeof h);
    
    while(m--)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b),add(b,a);
    }
    
    bfs();
    
    for(int i=1;i<=n;i++)
    printf("%d\n",cnt[i]);
    
    return 0;
}

 

标签:cnt,遍历,idx,int,短路,st,计数,dis
From: https://www.cnblogs.com/tolter/p/17212472.html

相关文章

  • PostgreSQL 计数查询效率,物化视图 [重复]
    PostgreSQL计数查询效率,物化视图[重复]问题:PostgreSQL计数查询效率,物化视图[重复]可能重复:PostgreSQL计数查询优化使用PostgreSQL9.2,我们试图弄清楚是否有......
  • AcWing 第 94 场周赛 A B(最短路dij) C(最短路floyed)
    https://www.acwing.com/activity/content/competition/problem_list/2961/AcWing4870.装物品水题#include<bits/stdc++.h>usingnamespacestd;typedeflonglon......
  • 最短路之和
    最短路之和给定一个$n$个点的加权有向图,点的编号为$1\simn$。图中任意两点之间都有两条方向相反的边连接两点。从点$i$到点$j$的边的长度为$a_{ij}$。给定一......
  • 四位计数器testbench的设计
    简单介绍一下四位计数器所要满足的条件: 1.4bit循环计数;      1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,1,.......2.能同步清零;        高电平有效3.有加载功能......
  • 最短路径算法
    原理1.算出目前数据中,起点到终点的最短路径2.路径从短到长获取目前最短的路径,设置标识,有标识的不参与下一步循环 packagecom.jason.base.arithmetic;importlom......
  • 【牛客】7 计数器&存储器&综合
    VL50 简易秒表`timescale1ns/1nsmodulecount_module(inputclk,inputrst_n,outputreg[5:0]second,outputreg[5:0]minute);......
  • 设计数据库
    1、规范数据库设计1.1、为什么需要要设计数据库当数据库比较复杂的时候,我们就需要设计了糟糕的数据库设计:数据冗余,浪费空间数据插入和删除都会麻烦、异常【屏蔽使用......
  • CF1773D Dominoes - 网络流 - 二分图 - 计数 -
    题目链接:https://codeforces.com/problemset/problem/1773/D题解:首先将棋盘黑白染色,是一个二分图由于题目保证初始状态一定能密铺,因此这个二分图一定有完美匹配现在要......
  • dijkstra 建立虚拟源点求最短路
    题目:有N个村庄,编号1到N。村庄之间有M条无向道路,第i条道路连接村庄ai和村庄bi,长度是ci。所有村庄都是连通的。共有K个村庄有商店,第j个有商店的村庄编......
  • pat 乙级1024 科学计数法关于stl中size()的一些思考即测试点六,无符号整数问题
    来,先看题目:1024科学计数法分数20作者HOU,Qiming单位浙江大学科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9].[0-9]+......