路径方案数(mod)

路径方案数(mod)

[题目描述]

给一张无向图,n 个点和 m 条边,cyb 在 1 号点,他要去 2 号点,

cyb 可以从 a 走到 b,当且仅当a到2的最短路,比b 到2的最短路长。

求 cyb 的路径方案数

两条路径不同,当且仅当将两条路径中依次经过的边的编号不完全相同,

图可能会有重边;

由于答案可能很大,

只需要输出答案对于 10^9+9 取模的值即可

[输入文件]

第一行两个正整数 n,m

接下来 m 行

每行 x,y,z 表示有一条边,长度为 z,链接了 x,y

[输出文件]

一个正整数表示答案

[输入样例1]                                          [输入样例2]

5 6                                                         7 8

1 3 2                                                      1 3 1

1 4 2                                                      1 4 1

3 4 3                                                      3 7 1

1 5 12                                                    7 4 1

4 2 34                                                    7 5 1

5 2 24                                                    6 7 1

5 2 1

6 2 1

[输出样例 1]                                         [输出样例 2]

2                                                          4

[数据范围]

30%:   N<=100,M<=1000

100%: N<=50000,,M<=100000

每条边的长度<=1000

题解:

首先处理出每个点到2的距离,重新建图,跑一遍拓扑排序,注意一下统计路径数量就可以了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#define mod (1000000009)
using namespace std;
typedef long long lol;
lol n,m;
struct node{lol next,to,dis;}edge[200005];
struct Map{lol from,to;}map[100005];
lol head[50005],size=1;
void putin(lol from,lol to,lol dis){size++;edge[size].next=head[from];edge[size].to=to;edge[size].dis=dis;head[from]=size;}
lol gi()
{
    lol ans=0,f=1;
    char i=getchar();
    while(i<‘0‘||i>‘9‘){if(i==‘-‘)f=-1;i=getchar();}
    while(i>=‘0‘&&i<=‘9‘){ans=ans*10+i-‘0‘;i=getchar();}
    return ans*f;
}
lol dist[50005];
bool vis[50005];
void SPFA(lol r)
{
    lol i,j;
    memset(dist,127/3,sizeof(dist));
    queue<lol>mem;
    dist[r]=0;
    vis[r]=1;
    mem.push(r);
    while(!mem.empty())
    {
        lol x=mem.front();mem.pop();
        vis[x]=0;
        for(i=head[x];i!=-1;i=edge[i].next)
        {
            lol y=edge[i].to;
            if(dist[y]>dist[x]+edge[i].dis)
            {
                dist[y]=dist[x]+edge[i].dis;
                if(!vis[y])
                {
                    mem.push(y);
                    vis[y]=1;
                }
            }
        }
    }
}
lol in[50005];
void make()
{
    lol i;
    memset(head,-1,sizeof(head));
    size=1;
    for(i=1;i<=m;i++)
    {
        if(dist[map[i].from]>dist[map[i].to])putin(map[i].from,map[i].to,1),in[map[i].to]++;
        else if(dist[map[i].from]<dist[map[i].to])putin(map[i].to,map[i].from,1),in[map[i].from]++;
    }
    return;
}
lol ans[50005];
void solve(lol r)
{
    lol i;
    memset(vis,0,sizeof(vis));
    queue<lol>mem;
    ans[r]=1;
    for(i=1;i<=n;i++)
    if(!in[i])
    {
        mem.push(i);
        vis[i]=1;
    }
    while(!mem.empty())
    {
        lol x=mem.front();mem.pop();
        vis[x]=0;
        for(i=head[x];i!=-1;i=edge[i].next)
        {
            lol y=edge[i].to;
            ans[y]=(ans[y]+ans[x])%mod;
            in[y]--;
            if(!in[y]&&!vis[y])mem.push(y),vis[y]=1;
        }
    }
}
int main()
{
    lol i,j;
    n=gi();m=gi();
    memset(head,-1,sizeof(head));
    for(i=1;i<=m;i++)
    {
        lol from=gi(),to=gi(),dis=gi();
        map[i].from=from;map[i].to=to;
        putin(from,to,dis);
        putin(to,from,dis);
    }
    SPFA(2);
    make();
    solve(1);
    printf("%lld",ans[2]);
    return 0;
}
时间: 2024-08-30 06:51:21

路径方案数(mod)的相关文章

路径方案数_mod_SPFA_记忆化搜索_C++

本文含有原创题,涉及版权利益问题,严禁转载,违者追究法律责任 本来是写个 DP 分分钟就 A 了,结果老师要我们写记忆化搜索(无奈脸) 算啦,随手一改又是一个标准的记忆化搜索(目测好像是记忆化搜索容易码一些,而且跑得快一些) 话说不取模也可以A,数据太水 很水的题吧,先 SPFA 跑一遍 2 的最短路,然后记忆化搜索统计方案 不难证明在加上最短路的限制条件后,图变成了一个 DAG 证明:首先有向是显然的,不可能存在两点 x,y,它们的最短路 d[x]>d[y] 又 d[x]<d[y] 若存在一

hdu 2157 从a点走到b点刚好k步的方案数是多少 (矩阵快速幂)

n个点 m条路 询问T次 从a点走到b点刚好k步的方案数是多少 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值把 给定的图转为邻接矩阵,即A(i,j)=1当且仅当存在一条边i->j.令C=A*A,那么C(i,j)=ΣA(i,k)*A(k,j),实际上就 等于从点i到点j恰好经过2条边的路径数(枚举k为中转点).类似地,C*A的第i行第j列就表示从i到j经过3条边的路径数 Sample Input4 4 // n m0 10 21 32 32 //T0 3 2

hdoj 2157 How many ways?? 【矩阵快速幂】【求任意两点间的路径上 经过k个点的方案数】

How many ways?? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2102    Accepted Submission(s): 771 Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这

CF GYM100548 (相邻格子颜色不同的方案数 2014西安区域赛F题 容斥原理)

n个格子排成一行,有m种颜色,问用恰好k种颜色进行染色,使得相邻格子颜色不同的方案数. integers n, m, k (1 ≤n, m ≤ 10^9, 1 ≤ k ≤ 10^6, k ≤ n, m). m种颜色取k种 C(m, k) 这个可以放最后乘 那么问题就变成只用k种颜色第一个格子有k种涂法 第二个有k-1种 第三个也是k-1种 一共就是k*(k-1)^(n-1) 这种算法仅保证了相邻颜色不同,总颜色数不超过k种,并没有保证恰好出现k种颜色 也就是多算了恰好出现2种 恰好出现3种...

NOIP2012pj摆花[DP 多重背包方案数]

题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列. 试编程计算,一共有多少种不同的摆花方案. 输入输出格式 输入格式: 第一行包含两个正整数n和m,中间用一个空格隔开. 第二行有n个整数,每两个整数之间用一个空格隔开,依次表示a1.a2.……an. 输出格式: 输出只有一行,一个整数

poj 3734 方块涂色 求红色 绿色方块都为偶数的方案数 (矩阵快速幂)

N个方块排成一列 用红,蓝,绿,黄4种颜色去涂色,求红色方块 和绿色方块个数同时为偶数的 方案数 对10007取余 Sample Input 212Sample Output 2//(蓝,黄)6//(红红,蓝蓝,蓝黄,绿绿,黄蓝,黄黄) 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <map>

[来源不详]删数方案数

Description 给出一个正整数序列 a,长度为 n,cyb 不喜欢完美,他要删掉一些数(也可以不删,即删掉0个),但是他不会乱删,他希望删去以后,能将 a 分成 2 个集合,使得两个非空集合的数的和相同,现在他希望你能帮他算出删数的方案数. Input 第一行 n 个正整数 以下有 n行,每行1个 正整数表示整数序列a Output 一个整数表示答案 Sample Input 4 1 2 3 4 Sample Output 3 Hint 30%:n<=5 100%:n<=20 100%

hdu5794 A Simple Chess 容斥+Lucas 从(1,1)开始出发,每一步从(x1,y1)到达(x2,y2)满足(x2?x1)^2+(y2?y1)^2=5, x2&gt;x1,y2&gt;y1; 其实就是走日字。而且是往(n,m)方向走的日字。还有r个障碍物,障碍物不可以到达。求(1,1)到(n,m)的路径条数。

A Simple Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2597    Accepted Submission(s): 691 Problem Description There is a n×m board, a chess want to go to the position (n,m) from the pos

Codeforces 461B. Appleman and Tree[树形DP 方案数]

B. Appleman and Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Appleman has a tree with n vertices. Some of the vertices (at least one) are colored black and other vertices are color