• 洛谷 P1144 最短路计数 Label:水


    题目描述

    给出一个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 4
    2 3
    4 5
    4 5
    
    输出样例#1:
    1
    1
    1
    2
    4
    

    说明

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

    对于20%的数据,N ≤ 100;

    对于60%的数据,N ≤ 1000;

    对于100%的数据,N ≤ 100000,M ≤ 200000。

    代码

     1 #include<algorithm>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<vector>
     6 #include<queue>
     7 #define INF 0x3f3f3f3f
     8 #define MAXN 500000
     9 using namespace std;
    10 
    11 struct cc{
    12     int d,num;
    13 };
    14 
    15 struct cmp{
    16     bool operator()(cc a,cc b){
    17         return a.d>b.d;
    18     }
    19 };
    20 
    21 cc make_(int num,int d){
    22     cc x;x.d=d;x.num=num;return x;
    23 }
    24 
    25 priority_queue<cc,vector<cc>,cmp> que;
    26 vector<int> G[MAXN];
    27 int N,M,s,t;
    28 int dis[MAXN],vis[MAXN];
    29 int sum[MAXN];
    30 
    31 void Dijkstra(){
    32     memset(dis,0x3f,sizeof(dis));
    33     que.push(make_(1,0));
    34     dis[1]=0;sum[1]=1;
    35     while(!que.empty()){
    36         cc x=que.top();que.pop();
    37         if(vis[x.num])continue;vis[x.num]=1;
    38         for(int i=0;i<G[x.num].size();i++){
    39             int to=G[x.num][i];
    40             if(dis[x.num]+1<dis[to]){
    41                 if(dis[to]==INF) {sum[to]=sum[x.num];sum[to]%=100003;}
    42                 dis[to]=dis[x.num]+1;
    43                 que.push(make_(to,dis[to]));
    44             }
    45             else if(dis[x.num]+1==dis[to]){sum[to]+=sum[x.num];sum[to]%=100003;}
    46 //            printf("%d")
    47         }
    48     }
    49 }
    50 
    51 void init_(){
    52     scanf("%d%d",&N,&M);
    53     int u,v,w;
    54     for(int i=1;i<=M;i++){
    55         scanf("%d%d",&u,&v);
    56         G[u].push_back(v);
    57         G[v].push_back(u);
    58     }
    59     Dijkstra();
    60 }
    61 
    62 int main(){
    63 //    freopen("01.in","r",stdin);
    64     init_();
    65     for(int i=1;i<=N;i++){
    66         printf("%d
    ",sum[i]);
    67     }
    68     return 0;
    69 }
    QAQ,水题就别看了吧

    跟热浪同一个类型吧

    版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 相关阅读:
    ADL(C++参数依赖查找)
    Sublime Text3 + Golang搭建开发环境
    Zookeeper使用命令行(转载)
    软链接和硬链接(转载)
    kafka伪集群搭建
    使用librdkafka库实现kafka的生产和消费实例生产者
    vector和map使用erase删除元素
    jquery html函数的一个问题
    贪心类区间问题
    快速幂
  • 原文地址:https://www.cnblogs.com/radiumlrb/p/6001756.html
Copyright © 2020-2023  润新知