Luogu 1144 最短路计数

反思 :等于号啊等于号,判断要==(=.=);

#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
typedef long long LL;
struct e
{
    int from,to;
};
typedef struct{
    int i,di;
}node;
bool operator < (node a,node b){return a.di>b.di;}
vector<int>G[1000000];
struct e edge[2000005];
int dis[1000000],num[1000000];
int en=-1;
priority_queue<node>q;
void addedge(int a ,int n)
{
    G[a].push_back(n);
}
int main()
{
    memset(dis,0x7f,sizeof(dis));
    memset(num,0,sizeof(num));
    memset(edge,0,sizeof(edge));
    int n,m,a,b;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&a,&b);
        edge[++en]=(struct e){a,b};
        addedge(a,en);
        edge[++en]=(struct e){b,a};
        addedge(b,en);
    }

    q.push((node){1,0});
    dis[1]=0;num[1]=1;
    while(!q.empty())
    {
        node x=q.top();
        q.pop();
        if(dis[x.i]!=x.di)continue;
        for(int j=0;j<G[x.i].size();j++)
        {
            if(dis[edge[G[x.i][j]].to]==x.di+1) num[edge[G[x.i][j]].to]=(num[edge[G[x.i][j]].to]+num[x.i])%100003;
            if(dis[edge[G[x.i][j]].to]>x.di+1)
            {
                dis[edge[G[x.i][j]].to]=x.di+1;
                num[edge[G[x.i][j]].to]=num[x.i];
                q.push((node){edge[G[x.i][j]].to,x.di+1});
            }
        }
    }
    for(int j=1;j<=n;j++)
    printf("%d\n",num[j]);
    return 0;
}
时间: 2024-08-03 03:49:39

Luogu 1144 最短路计数的相关文章

洛谷 1144 最短路计数 bfs

洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移,最后输出cnt即为结果.. 题目中所说的重边和自环啥的没看出来有啥影响.. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int maxn = 100000 + 500;

洛谷1144 最短路计数

本题地址:http://www.luogu.org/problem/show?pid=1144 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边. 输出格式: 输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需

luogu P1144 最短路计数

题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边. 输出格式: 输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可.如果无法到达顶点i则输出0. 输入输出样例 输入样例#1

spfa+dp(洛谷1144 最短路计数)

给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边. 输出格式: 输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可.如果无法到达顶点i则输出0. 输入样例#1: 5 7 1 2 1 3 2 4 3

洛谷1144最短路计数

一道水题.... 因为是无权图 对于整个图应用一个bfs处理出最短路, 之后在重复更新时应用一个转移方程即可 sum[x]=∑sum[n];,n为能更新x最短路的点. 上代码~ #include<queue> #include<stdio.h> using namespace std; int n;int m; struct data { int v;int next; }edge[4000010]; int cnt;int alist[1000010]; void add(int

【luogu P1144 最短路计数】 题解

题目链接:https://www.luogu.org/problemnew/show/P1144 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <queue> 5 #include <vector> 6 using namespace std; 7 const int mod = 100003; 8 const int maxn = 2000

洛谷P1144 最短路计数(SPFA)

To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边. 输出格式: 输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可.如果无法到达顶点i则输

Luogu P1608 路径统计 最短路计数

颓了...重边导致我乖乖用邻接矩阵.... 好吧就是个最短路计数....如果更新时d[v]==d[u]+w[i],就可以接起来,把两个加在一起.. 如果d[v]>d[u]+w[i],那么c[v]直接赋值为c[u],相当于这个最短路是由u转移过来的. #include<cstdio> #include<iostream> #include<cstring> #include<queue> #define R register int using name

习题:最短路计数(SPFA最短路计数)

最短路计数(洛谷1144)题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条.输入输出格式输入格式:输入第一行包含2个正整数N,M,为图的顶点数与边数.接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边.输出格式:输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可.如果无法到达顶点i则输出0.输入输出样例输