首页 > 其他分享 >洛谷P1144

洛谷P1144

时间:2022-11-01 16:49:13浏览次数:42  
标签:le 洛谷 int 短路 P1144 spfa ans 顶点

最短路计数

题目描述

给出一个 \(N\) 个顶点 \(M\) 条边的无向无权图,顶点编号为 \(1\sim N\)。问从顶点 \(1\) 开始,到其他每个点的最短路有几条。

输入格式

第一行包含 \(2\) 个正整数 \(N,M\),为图的顶点数与边数。

接下来 \(M\) 行,每行 \(2\) 个正整数 \(x,y\),表示有一条由顶点 \(x\) 连向顶点 \(y\) 的边,请注意可能有自环与重边。

输出格式

共 \(N\) 行,每行一个非负整数,第 \(i\) 行输出从顶点 \(1\) 到顶点 \(i\) 有多少条不同的最短路,由于答案有可能会很大,你只需要输出 $ ans \bmod 100003$ 后的结果即可。如果无法到达顶点 \(i\) 则输出 \(0\)。

样例 #1

样例输入 #1

5 7
1 2
1 3
2 4
3 4
2 3
4 5
4 5

样例输出 #1

1
1
1
2
4

提示

\(1\) 到 \(5\) 的最短路有 \(4\) 条,分别为 \(2\) 条 \(1\to 2\to 4\to 5\) 和 \(2\) 条 \(1\to 3\to 4\to 5\)(由于 \(4\to 5\) 的边有 \(2\) 条)。

对于 \(20\%\) 的数据,\(1\le N \le 100\);
对于 \(60\%\) 的数据,\(1\le N \le 10^3\);
对于 \(100\%\) 的数据,\(1\le N\le10^6\),\(1\le M\le 2\times 10^6\)。


1、因为边权是1所以bfs,spfa,dijkstra都可以因为spfa最近在学习所以而且spfa打起来挺顺手的,就用spfa打的

2、我们用一个数组记录每个点最短路的答案

3、这里自环和重边不要用考虑,因为前向星中存的边会跑完,重边会跑两遍,这样的话不会影响计数的,举个例子就是

1 2
1 2
1 2

这里答案会输出1 2,因为1到2有两条边会都会跑所以最短路有两条

4、我们考虑ans的更新。采用分类讨论。

if(d[j] > d[t] + 1)
            {
                d[j] = d[t] + 1;
                ans[j] = ans[t] % mod;
                if(!inq[j])
                {
                    inq[j] = 1;
                    q.push(j);
                }
            }
            else if(d[j] == d[t] + 1)    
            ans[j] =(ans[j] + ans[t]) % mod;

5、注意答案要边计算边取模

6、注意要初始化链表啊,表头最开始全部初始化为 -1


#include <iostream>
#include <cstring>
#include <queue>

using namespace std;

const int N = 1e6 + 10, M = 2e6 + 10, mod = 100003;

int n, m, ans[N];

int h[N], e[M], ne[M], idx;
void add(int a, int b)
{
    e[idx] = b; ne[idx] = h[a]; h[a] = idx ++;
}

int d[N];
bool inq[N];
void spfa()
{
    queue<int> q;
    for(int i = 1; i <= n; ++ i)    d[i] = 0x7fffffff;
    memset(inq, 0, sizeof inq);
    d[1] = 0; q.push(1); inq[1] = 1; ans[1] = 1;
    while(q.size())
    {
        auto t = q.front(); q.pop(); inq[t] = 0;
        for(int i = h[t]; i != -1; i = ne[i])
        {
            int j = e[i];
            if(d[j] > d[t] + 1)
            {
                d[j] = d[t] + 1;
                ans[j] = ans[t] % mod;
                if(!inq[j])
                {
                    inq[j] = 1;
                    q.push(j);
                }
            }
            else if(d[j] == d[t] + 1)    
            ans[j] =(ans[j] + ans[t]) % mod;
        }
    } 
}
int main()
{
    freopen("1.txt","r",stdin);
    memset(h, -1, sizeof h);
    cin >> n >> m;
    for(int i = 1; i <= m; ++ i)
    {
        int a, b; cin >> a >> b;
        add(a, b);add(b, a);
    }
    spfa();
    for(int i = 1; i <= n; ++ i)    cout << ans[i] << endl;
    return 0;
}

标签:le,洛谷,int,短路,P1144,spfa,ans,顶点
From: https://www.cnblogs.com/cxy8/p/16848221.html

相关文章

  • 洛谷 P6573 [BalticOI 2017] Toll 题解
    Link算是回归OI后第一道自己写的题(考CSP的时候可没回归)写篇题解纪念一下题目大意:\(n\)个点,\(m\)条单向边,每条边的两端点\(x\),\(y\)必定满足\(\left\lfloor\dfrac......
  • 洛谷P1462spfa + 二分答案
    第一次接触二分答案的题目最开始是没有思路的看了一个题解,然后强行理解之后开始自己打了一遍,然而结果是只得了30分过了3个点其他全wa,之后是漫长的debug,这里想感慨一句自己d......
  • 洛谷 P5369
    先规定一些东西:若存在多个\(p\)使得\(\sum_{i=1}^{p}{a_i}\)最大,默认最大(即最靠右)的一个\(p\)是它的最大前缀和的位置。\(U\)表示全集。假设\(p\)是最大前缀......
  • 洛谷 P1464 Function(dfs+记忆化搜索)
    https://www.luogu.com.cn/problem/P1464单个返回条件的时候,直接return多个返回条件的时候,采用记忆化搜索思想,边存储边继续往下搜索中间穿插记忆化判断,如果之前有过此......
  • 【洛谷P7816 】【Stoi2032】以父之名
    在洛谷题解中看到了两种做法。法一:与zjr巨佬说的类似,我们先能观察出这个图的几个性质:若只保留边权为\(1\)的边,那么所有点的度数都是奇数。那么也可以得到\(n\)为偶......
  • 洛谷 P1153 点和线
    前置知识(1)求两条线段的交点方法1,运用高中的解析几何知识求.方法2,运用向量点积求.考虑向量叉乘。若\(\veca\times\vecb>0\),那么\(\vecb\)在\(\veca\)......
  • 洛谷 P1789【Mc生存】插火把
    萌新写的代码,长但模块化#include<stdio.h>#defineROW100#defineCOLUMN100intmap[ROW][COLUMN];/*函数测试数据={1,1,1,0,0,1,1,0,1,0,1,1,1,0,0,0,0,0,0,0......
  • 洛谷P8539 「Wdoi-2」来自地上的支援 题解
    ST表做法思路当进行第\(x\)次操作时,若\(b_1\)到\(b_{x-1}\)中有比\(b_x\)大的数,那这次操作轮不到\(b_x\),并且前面的本来就比它大的数只会越来越大,所以以后的......
  • P1597洛谷刷题
    #include<iostream>#include<string>usingnamespacestd;intmain(intargc,char**argv){ stringstr="a:=3;b:=4;c:=5"; for(inti=1;i<=3;i++){ ints......
  • 洛谷P5759题解
    本文摘自本人洛谷博客,原文章地址:https://www.luogu.com.cn/blog/cjtb666anran/solution-p5759\[这道题重在理解题意\]选手编号依次为:\(1,2...N\)(\(N\)为参赛总人数)。......