T57274 黑暗城堡

news/2024/7/4 8:41:18

传送门

思路:

  先求出各个点到 1 的最短路径。分别用两个数组将最短路径记录下来(一个要用来排序)。按排序后的 dis 值从小到大枚举各点加入树有多少种方案,最后根据乘法原理把各个点的方案数乘起来就是答案。(实现起来会比较繁琐)

Code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
#include<cstring>
#include<string>
#include<deque>
#include<map>
#include<cmath>
#include<stack>
#include<vector>
#include<queue>
#include<cstdlib>
using namespace std;
#define lck_max(a,b) ((a)>(b)?(a):(b))
#define lck_min(a,b) ((a)<(b)?(a):(b))
typedef long long LL;
const int maxn=1e6+7;
const int INF=1e9+7;
const LL mod=(1LL<<31)-1;
inline LL read()
{
    LL kr=1,xs=0;
    char ls;
    ls=getchar();
    while(!isdigit(ls))
    {
        if(!(ls^45))
            kr=-1;
        ls=getchar();
    }
    while(isdigit(ls))
    {
        xs=(xs<<1)+(xs<<3)+(ls^48);
        ls=getchar();
    }
    return xs*kr;
}
inline void out(LL xs)
{
    if(!xs) {putchar(48); return;}
    if(xs<0) putchar('-'),xs=-xs;
    int kr[57],ls=0;
    while(xs) kr[++ls]=xs%10,xs/=10;
    while(ls) putchar(kr[ls]+48),ls--;
}
inline LL ksc(LL x,LL y)
{
    LL tmp=(x*y-(LL)((long double)x/mod*y+1.0e-8)*mod);
    return tmp<0 ? tmp+mod : tmp;
}
LL n,m,ans=1,cnt,head[maxn<<1],f[maxn<<1],dis[maxn];
bool vis[maxn<<1];
priority_queue<pair<LL,LL>,vector<pair<LL,LL> >,greater<pair<LL,LL> > > q;
struct node
{
    LL nex,to,w;
}t[maxn<<1];
struct hh
{
    LL dis,num;
}T[maxn<<1];
inline bool cmp(const hh&x,const hh&y)
{
    return x.dis<y.dis;
}
inline void add(LL nex,LL to,LL w)
{
    t[++cnt].nex=head[nex];
    t[cnt].to=to;
    t[cnt].w=w;
    head[nex]=cnt;
}
inline void dijkstra(LL s)
{
    for (LL i=1;i<=n;i++) T[i].dis=INF;
    T[1].dis=0;
    q.push(make_pair(T[1].dis,s));
    while(!q.empty())
    {
        LL u=q.top().second; q.pop();
        if(vis[u]) continue; vis[u]=true;
        for(LL i=head[u];i;i=t[i].nex)
        {
            LL v=t[i].to,w=t[i].w;
            if (T[v].dis>T[u].dis+w) {T[v].dis=T[u].dis+w;q.push(make_pair(T[v].dis,v));}
        }
    }
}
inline void dfs()
{
    memset(vis,false,sizeof(vis));
    vis[1]=true;
    for(LL i=2;i<=n;i++)
    {
        LL u=T[i].num;vis[u]=true;
        for(LL j=head[u];j;j=t[j].nex)
        {
            LL v=t[j].to;
            if(vis[v]&&dis[v]+t[j].w==T[i].dis) f[i]++;
        }
    }
}
LL x,y,z;
int main()
{
    n=read();m=read();
    for (LL i=1;i<=m;i++)
        x=read(),y=read(),z=read(),add(x,y,z),add(y,x,z);
    dijkstra(1);
    for (LL i=1;i<=n;i++) T[i].num=i,dis[i]=T[i].dis;
    std::sort(T+1,T+n+1,cmp);
    dfs();
    for(LL i=2;i<=n;i++) ans=ksc(ans,f[i]);
    out(ans),putchar('\n');
}

 

转载于:https://www.cnblogs.com/lck-lck/p/9914313.html


http://www.niftyadmin.cn/n/658019.html

相关文章

NIO学习笔记

参考《JavaNIO》 为什么需要缓存区 1&#xff0c;硬件通常不支持直接访问用户空间(java进程处于用户空间) 2&#xff0c;磁盘操作的是固定大小的数据块&#xff0c;而用户进程请求可能是任意大小的数据块&#xff0c;需要内核进行分解再组合 虚拟内存的好处 1&#xff0c;…

上网的时候出现 Automation 服务器不能创建对象 的解决方法

最近我重新安装的机器&#xff0c;发现上csdn网站的论坛的时候&#xff0c;左面的树展不开&#xff0c;每次点节点的时候都会出错。错误为&#xff1a;"Automation 服务器不能创建对象"&#xff0c;郁闷坏了。 同时我访问 http://www.chinare.com 的时候 也不能 留言…

xj膜你赛27

凯旋而归 有 \(n\) 个数&#xff0c;第 \(i\) 个数为 \(a_i\) 。对于一个由 \(n\) 个数组成的序列 \(a\) ,定义它的帅气值\[f(a)max\{(a_1xora_2xor...xora_i)(a_{i1}xora_{i2}xor...xora_n)\}\] 现在给出 \(n\) 个数组成的序列 \(a\) ,求计算 \(a\) 的每个前缀的帅气值。 样例…

Qt中QString、QByteArray、int、double之间转换

Qt中QString、QByteArray、int、double之间转换 最近写Qt中的tcp网络编程&#xff0c;Socke连接后&#xff0c;接受到的数据类型是字节型&#xff0c;这就涉及到了大量的类型转换&#xff0c;在网上辗转几辄&#xff0c;总算有了点结果&#xff0c;特此跟大家分享。好了&#x…

用Java实现代码编辑器的下拉补全效果

效果 主要类(继承JTextArea监听输入,使用JComboBox显示下拉) 可以手动添加候选信息或&#xff0c;使用配置文件&#xff0c;读取配置文件 public class AutoCompleteTextArea extends JTextArea implements AutoCompleteListener {private Map<String,TipInfo> map;pr…

美国男子麦当劳快餐吃出死老鼠 索赔170万美元

【来源&#xff1a;中国新闻网】 【作者&#xff1a;钟岩】 美国得克萨斯州一名男子26日向联邦地方法院起诉麦当劳&#xff0c;其原因是他与家人在麦当劳的外带快餐里发现一只死老鼠。   美国达拉斯早晨新闻报道说&#xff0c;这位名为托德-哈利的男子向麦当劳索赔170万美元…

background-size css background-images

在设计网页时&#xff0c;经常会用到背景图片来达到视觉效果。 一般情况下用repeat的方式是最适全不过了&#xff0c;不过有时间是采用整图来充当背景&#xff0c;那么这个时候就会有多种可能性的存在了。 整图来做背景一般是采用no-repeat来实现的&#xff0c;但是屏幕大小是比…

WPF下递归生成树形数据绑定到TreeView上(转)

WPF下递归生成树形数据绑定到TreeView上 最终效果图&#xff1a;&#xff08;用于学习类的效果 图片丑了点&#xff0c;看官莫怪&#xff09; 新建窗体 然后在前端适当位置插入如下代码&#xff1a; <TreeView x:Name"departmentTree" Height"500" Wid…