• 黑暗城堡(最短路径树)


    试题描述
    你知道黑暗城堡有 N 个房间,M 条可以制造的双向通道,以及每条通道的长度。
    城堡是树形的并且满足下面的条件:
    设 Di为如果所有的通道都被修建,第 i 号房间与第 1 号房间的最短路径长度;
    而 Si为实际修建的树形城堡中第 i 号房间与第 1 号房间的路径长度;
    要求对于所有整数 i (1≤i≤N),有 Si=Di成立。
    你想知道有多少种不同的城堡修建方案。当然,你只需要输出答案对 2^31−1取模之后的结果就行了。
    输入
    第一行为两个由空格隔开的整数 N,M;
    第二行到第 M+1 行为 3 个由空格隔开的整数 x,y,l:表示 x 号房间与 y 号房间之间的通道长度为 l。
    输出
    一个整数:不同的城堡修建方案数对 2^31−1取模之后的结果。
    输入示例
    4 6
    1 2 1
    1 3 2
    1 4 3
    2 3 1
    2 4 2
    3 4 1
    输出示例
    6
    其他说明
    样例说明
    一共有 4个房间,6 条道路,其中 1 号和 2 号,1 号和 3 号,1 号和 4 号,2 号和 3 号,2 号和 4 号,3 号和 4 号房间之间的通道长度分别为 1,2,3,1,2,1。
    而不同的城堡修建方案数对 2^31−1取模之后的结果为 6。
    数据范围与提示
    对于全部数据,1≤N≤1000 ,1≤M≤[N(N−1)]/2  ,1≤l≤200。

    第一眼没有什么思路

    首先是很明确的要求出所有边情况下的最短路,我用的对油画的DJ,但是没有必要

    然后我呢对于每一条最短路,求出又几种边可以代替它,然后用加乘原理,注意ans的初值

    下面给出代码:

    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<queue>
    using namespace std;
    inline int rd(){
        int x=0,f=1;
        char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
        for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
        return x*f;
    }
    inline void write(int x){
        if(x<0) putchar('-'),x=-x;
        if(x>9) write(x/10);
        putchar(x%10+'0');
        return ;
    }
    int n,m;
    int head[100006];
    int nxt[2000006],to[2000006];
    int v[2000006];
    int total=0;
    struct node{
        int u,v;
        bool operator<(const node b) const{
            return u>b.u;
        }
    };
    void add(int x,int y,int z){
        total++;
        v[total]=z;
        to[total]=y;
        nxt[total]=head[x];
        head[x]=total;
        return ;
    }
    priority_queue <node> Q;
    int dis[100006];
    int book[100006];
    void Dijkstra(int x){
        dis[x]=0;
        node h;
        h.v=x;
        h.u=0;
        Q.push(h);
        while(!Q.empty()){
            h=Q.top();
            Q.pop();
            if(book[h.v]) continue;
            book[h.v]=1;
            for(int e=head[h.v];e;e=nxt[e]){
                if(dis[to[e]]>dis[h.v]+v[e]){
                    dis[to[e]]=dis[h.v]+v[e];
                    node a;
                    a.v=to[e];
                    a.u=dis[to[e]];
                    Q.push(a);
                }
            }
        }
        return ;
    }
    int cnt[100006];
    long long ans=1;
    int main(){
        n=rd(),m=rd();
        memset(dis,127,sizeof(dis));
        for(int i=1;i<=m;i++){
            int x=rd(),y=rd(),z=rd();
            add(x,y,z),add(y,x,z);
        }
        Dijkstra(1);
        for(int i=1;i<=n;i++){
            for(int e=head[i];e;e=nxt[e]){
                if(dis[to[e]]==dis[i]+v[e]) cnt[to[e]]++;
            }
        }
        for(int i=1;i<=n;i++){
            if(cnt[i]==0) continue;
            ans*=(long long)cnt[i];
            ans%=2147483647;
        }
        write(ans);
        return 0;
    }
    蒟蒻总是更懂你✿✿ヽ(°▽°)ノ✿
  • 相关阅读:
    VScode中Python的交互式命令环境使用笔记
    jmeter beanshell判断响应的json串,参数的值是否正确;
    类和类的继承 实现关系;
    类与类依赖关系,实例;
    类与类包含关系,实例;
    java中有package的编译执行;java编译乱码;
    java 类与类之间的关系,方法重写与方法重载的区别
    beanshell sampler构造响应数据;
    Scanner类及其中方法的使用;
    java 构造方法 代码块 this
  • 原文地址:https://www.cnblogs.com/WWHHTT/p/9839254.html
Copyright © 2020-2023  润新知