黑暗城堡(最短路径树)

黑暗城堡 

(castle.pas/c/cpp)

 

题目描述 

在顺利攻破 Lord lsp 的防线之后,lqr 一行人来到了 Lord lsp 的城堡下方。Lord lsp 黑化之后虽然拥有了强大的超能力,能够用意念力制造建筑物,但是智商水平却没怎么增加。现 lqr 已经搞清楚黑暗城堡有个房间,条可以制造的双向通道,以及每条通道的长度。 

lqr 深知 Lord lsp 的想法, 为了避免每次都要琢磨两个房间之间的最短路径,Lord lsp一定会把城堡修建成树形的; 但是,为了尽量提高自己的移动效率,Lord lsp 一定会使得城堡满足下面的条件:设 Di 为如果所有的通道都被修建, 号房间与第号房间的最短路径长度;而 Si 为实际修建的树形城堡中第号房间与第

号房间的路径长度,对于所有满足 1≤i≤N 的整数 i,有 Si = Di。为了打败 Lord lsplqr 想知道有多少种不同的城堡修建方案。于是 lqr  applepi 提出了这个问题。由于 applepi 要忙着出模拟赛,所以这个任务就交给你了。当然,你只需要输出答案对 231 – 1 取模之后的结果就行了。 

输入格式 

第一行有两个整数 N M 

之后行,每行三个整数 X L,表示可以修建之间的一条长度为的通道。 

输出格式 

输出一个整数,表示答案对 231 – 1 取模之后的结果。 

样例输入 

 

3

3

 

1

2

2

1

3

1

2

3

1

 

样例输出 

2

 

数据范围与约定 

对于 30% 的数据,2≤N≤5M≤10 

对于 50%  的数据,满足条件的方案数不超过 10000 

对于 100%  的数据,2≤N≤1000N – 1≤M≤N(N – 1)/21≤L≤100 

题目要求源点到其余点的最短路径d[i],并且求树上路径s[i]等于d[i]的生成树

所以先求出最短路径d[i],并记录d[i[是哪个点的最短路径属性为v;

然后按长度大小进行排序,为了避免重复计数,,最后把满足d[x]=d[y]+w[i][j]的一个点一个点的往生成树之中加

根据乘法原理求出答案即可

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
 
typedef long long ll;
 
const int maxn=1010;
const ll nil=(long long)1<<40-1;
#define mod ((1<<31)-1)
 
struct my{
       int v,next;
       ll w;
};
 
struct lmjer{
       int v;
       ll w;
};
 
struct node{
       int u;
       ll w;
       bool operator<(const node &rhs)const{
            return w>rhs.w;
       }
};
 
int fa,adj[maxn],n,m;
ll tu[maxn][maxn];
lmjer d[maxn];
bool done[maxn];
priority_queue<node>Q;
my bian[maxn*maxn];
 
void myinsert(int u,int v,ll w){
     bian[++fa].v=v;
     bian[fa].next=adj[u];
     bian[fa].w=w;
     adj[u]=fa;
}
 
void dijkstra(int s){
     for (int i=1;i<=n;i++) d[i].w=nil,d[i].v=i;
     d[s].w=0;
     node x;
     x.u=s;
     x.w=0;
     Q.push(x);
     while(!Q.empty()){
        x=Q.top();Q.pop();
        int u=x.u;
        if(done[u]) continue;
        done[u]=true;
        for (int i=adj[u];i;i=bian[i].next){
            int v=bian[i].v;
            if(d[v].w>d[u].w+bian[i].w){
                d[v].w=d[u].w+bian[i].w;
                x.u=v;
                x.w=d[v].w;
                Q.push(x);
            }
        }
     }
}
 
bool cmp(const lmjer a,const lmjer b){
     return a.w<b.w;
}
 
int main(){
    scanf("%d%d",&n,&m);
    memset(tu,10,sizeof(tu));
    int u,v;
    ll w;
    for (int i=1;i<=m;i++){
        scanf("%d%d%lld",&u,&v,&w);
        myinsert(u,v,w);
        myinsert(v,u,w);
        tu[u][v]=tu[v][u]=min(tu[u][v],w);
    }
    dijkstra(1);
    sort(d+1,d+1+n,cmp);
    int ans=1;
    for (int i=2;i<=n;i++){
            ll temp=0;
        for (int j=1;j<i;j++){
            int x=d[i].v,y=d[j].v;
            if(d[i].w==d[j].w+tu[x][y]) temp++;
        }
    ans=(long long)ans*temp%mod;
    }
    printf("%d\n",ans);
return 0;
}

 

转载于:https://www.cnblogs.com/lmjer/p/9354625.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个基本的Python海龟命令画城堡的示例代码: ```python import turtle # 设置画笔 t = turtle.Pen() t.speed(0) # 设置画笔速度为最快 # 画城堡墙壁 t.pensize(5) t.color('gray') t.begin_fill() for i in range(4): t.forward(200) t.right(90) t.end_fill() # 画城堡门 t.penup() t.goto(80, -50) t.pendown() t.color('brown') t.begin_fill() t.forward(40) t.left(90) t.forward(80) t.left(90) t.forward(40) t.left(90) t.forward(80) t.end_fill() # 画城堡旗帜 t.penup() t.goto(0, 110) t.pendown() t.color('red') t.begin_fill() t.forward(40) t.left(120) t.forward(80) t.left(120) t.forward(80) t.left(120) t.forward(40) t.end_fill() # 画城堡塔 t.penup() t.goto(-100, 0) t.pendown() t.color('gray') t.begin_fill() t.circle(50) t.end_fill() # 画城堡塔顶 t.penup() t.goto(-100, 100) t.pendown() t.begin_fill() t.color('brown') t.circle(20) t.end_fill() # 画城堡另一个塔 t.penup() t.goto(100, 0) t.pendown() t.color('gray') t.begin_fill() t.circle(50) t.end_fill() # 画城堡另一个塔顶 t.penup() t.goto(100, 100) t.pendown() t.begin_fill() t.color('brown') t.circle(20) t.end_fill() # 隐藏画笔 t.hideturtle() # 点击关闭窗口 turtle.exitonclick() ``` 代码解释: - 创建一个海龟对象t。 - 画城堡墙壁:设置画笔粗细和颜色,然后使用for循环画出四个边长为200的正方形。 - 画城堡门:使用penup()抬起画笔,goto()移动到门的位置,pendown()放下画笔,然后画出门的形状。 - 画城堡旗帜:使用penup()抬起画笔,goto()移动到旗帜的位置,pendown()放下画笔,然后画出旗帜的形状。 - 画城堡塔:使用penup()抬起画笔,goto()移动到塔的位置,pendown()放下画笔,然后画出塔的形状。 - 画城堡塔顶:使用penup()抬起画笔,goto()移动到塔顶的位置,pendown()放下画笔,然后画出塔顶的形状。 - 隐藏画笔,然后等待用户单击窗口关闭程序。 运行上述代码后,将会在窗口中画出一个城堡

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值