【问题描述】

给定一张?个点?条边的无向连通图,每条边有边权。我们需要从?条边中
选出? − 1条, 构成一棵树。 记原图中从 1 号点到每个节点的最短路径长度为? ? ,
树中从 1 号点到每个节点的最短路径长度为? ? ,构出的树应当满足对于任意节点
?,都有? ? = ? ? 。

请你求出选出? − 1条边的方案数。

【输入格式】

输入的第一行包含两个整数?和?。
接下来?行,每行包含三个整数?、?和?,描述一条连接节点?和?且边权为
?的边。

【输出格式】

输出一行,包含一个整数,代表方案数对2 31 − 1取模得到的结果。

【样例输入】

3 3
1 2 2
1 3 1
2 3 1

【样例输出】

2

【数据规模和约定】

32 ≤ ? ≤ 5,? ≤ 10。
对于50%的数据,满足条件的方案数不超过 10000。
对于100%的数据,2≤ ? ≤ 1000,? − 1 ≤ ? ≤
? ?−1
2
,1 ≤ ? ≤ 100。

思路:

  按照题目里的说的模拟

  先跑一遍spfa得出单源最短路

  然后对于每一个点枚举所有与它相连的点

  如果与它相连的点的dis值加上这条边的权值等于它的dis值

  则这个点的价值加一

  所有的点枚举完后

  把价值为0的点赋值为1

  然后所有点的价值相乘

  即可得出答案

  但是

  你以为这就是正解?

  别忘了取mod(因为这个我没了40分)

  有mod才是正解

来,上代码:

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream> using namespace std; struct node {
int from,to,dis,next;
};
struct node edge[]; const long long int mod=; int num_head,num_edge,num_1=,head[];
int dis_1[],tree_leaf[],num_leaf=; long long int ans_edge=;
long long int num_edge_tree[]; char word; bool if_in_tree[]; queue<int>q; inline void edge_add(int from,int to,int dis)
{
num_1++;
edge[num_1].to=to;
edge[num_1].dis=dis;
edge[num_1].from=from;
edge[num_1].next=head[from];
head[from]=num_1;
} inline void read_int(int &now_001)
{
now_001=;word=getchar();
while(word>''||word<'') word=getchar();
while(word>=''&&word<='')
{
now_001=now_001*+(int)(word-'');
word=getchar();
}
} void map_spfa()
{
bool if_in_spfa[];
memset(dis_1,/,sizeof(dis_1));
memset(if_in_spfa,false,sizeof(if_in_spfa));
dis_1[]=;
if_in_spfa[]=true;
q.push();
int cur_1,cur_2;
while(!q.empty())
{
cur_1=q.front();
for(int i=head[cur_1];i!=;i=edge[i].next)
{
if(dis_1[cur_1]+edge[i].dis<dis_1[edge[i].to])
{
dis_1[edge[i].to]=dis_1[cur_1]+edge[i].dis;
if(!if_in_spfa[edge[i].to])
{
q.push(edge[i].to);
if_in_spfa[edge[i].to]=true;
}
}
}
if_in_spfa[cur_1]=false;
q.pop();
}
} int main()
{
read_int(num_head),read_int(num_edge);
int from,to,dis;
for(int i= ; i<=num_edge ; i++)
{
read_int(from),read_int(to),read_int(dis);
edge_add(from,to,dis);
edge_add(to,from,dis);
}
map_spfa();
for(int j=;j<=num_head;j++)
{
for(int i=head[j];i!=;i=edge[i].next)
{
if(edge[i].dis+dis_1[j]==dis_1[edge[i].to])
{
num_edge_tree[edge[i].to]++;
num_edge_tree[edge[i].to]%=mod;
}
}
}
for(int i=;i<=num_head;i++) if(num_edge_tree[i]==) num_edge_tree[i]=;
for(int i=;i<=num_head;i++)
{
ans_edge*=num_edge_tree[i];
ans_edge%=mod;
}
cout<<ans_edge<<endl;
return ;
}

城堡 (spfa+cheng)的更多相关文章

  1. ACM/ICPC 之 最短路-Floyd+SPFA(BFS)+DP(ZOJ1232)

    这是一道非常好的题目,融合了很多知识点. ZOJ1232-Adventrue of Super Mario 这一题折磨我挺长时间的,不过最后做出来非常开心啊,哇咔咔咔 题意就不累述了,注释有写,难点在 ...

  2. ZOJ1232 Adventure of Super Mario spfa上的dp

    很早之前听说有一种dp是在图上的dp,然后是在跑SPFA的时候进行dp,所以特地找了一题关于在SPFA的时候dp的. 题意:1~a是村庄 a+1~a+b是城堡,存在m条无向边.求由a+b->1的 ...

  3. LOJ#10064. 「一本通 3.1 例 1」黑暗城堡

    LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...

  4. 一本通 P1486 【黑暗城堡】

    题库 :一本通 题号 :1486 题目 :黑暗城堡 link :http://ybt.ssoier.cn:8088/problem_show.php?pid=1486 思路 :这道题既然要求使加入生成 ...

  5. 信息奥赛一本通1486: CH 6202 黑暗城堡 最短路径生成树计数

    1486:黑暗城堡 [题目描述] 知道黑暗城堡有 N 个房间,M 条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设 Di为如果所有的通道都被修建,第 i 号房间与第 1 ...

  6. 【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa

    3627: [JLOI2014]路径规划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 186  Solved: 70[Submit][Status] ...

  7. POJ 2387 Til the Cows Come Home(最短路 Dijkstra/spfa)

    传送门 Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 46727   Acce ...

  8. sgu 240 Runaway (spfa)

    题意:N点M边的无向图,边上有线性不下降的温度,给固定入口S,有E个出口.逃出去,使最大承受温度最小.输出该温度,若该温度超过H,输出-1. 羞涩的题意 显然N*H的复杂度dp[n][h]表示到达n最 ...

  9. spfa模板

    通过stl的queue实现的spfa(vector实现邻接表存图) 本模板没有考虑存在两点不连通的情况 如果需要判断则需要用到并查集或者遍历整个邻接表 #include<iostream> ...

随机推荐

  1. 类库LinqToExcel的介绍

            LinqToExcel是一个.net framework平台下开源项目,它主要实现了LINQ的语法查询Excel电子表格.类型之前的LINQToXXX如果你是LINQ语法糖爱好者那最适 ...

  2. 研究jdk关于TreeMap 红黑树算法实现

    因为TreeMap的实现方式是用红黑树这种数据结构进行存储的,所以呢我主要通过分析红黑树的实现在看待TreeMap,侧重点也在于如何实现红黑树,因为网上已经有非常都的关于红黑树的实现.我也看了些,但是 ...

  3. CSS3中的box-shadow

    语法: box-shadow: h-shadow v-shadow blur spread color inset; box-shadow 向框添加一个或多个阴影.该属性是由逗号分隔的阴影列表,每个阴 ...

  4. seajs学习笔记

    seajs配置 seajs.config({ //别名配置 alias:{ 'es5-safe':'gallery/es5-safe/0.9.3/es5-safe', 'jquery':'jquery ...

  5. CSS3中的calc()

    什么是calc()? calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能; MDN的解释为可以用在任何长度,数值,时间,角度,频率等处; /* property: calc ...

  6. 如何在 在SharePoint 2013/2010 解决方案中添加 ashx (HttpHandler)

    本文讲述如何在 在SharePoint 2013/2010 解决方案中添加 ashx (HttpHandler). 一般处理程序(HttpHandler)是·NET众多web组件的一种,ashx是其扩 ...

  7. iOS 获取UIView所在的VIewController

    写程序的时候我们经常要封装代码,当你封装了一个UIView的子类里需要调用所在ViewController的方法用如下代码调取所在的VIewController #pragma mark - 获取所在 ...

  8. arc下内存泄漏的解决小技巧

    一定要注意,我们运行app时,一定要关心内存的使用,尽量不要超过20M,即使有很多图片要显示也绝对不能超过30M.所以运行自己开发的app时多关心内存的使用是个很好的习惯. 对于性能,内存的优化,这个 ...

  9. STL--容器适配器(queue、priority_queue、stack)

    适配器(Adaptor)是提供接口映射的模板类.适配器基于其他类来实现新的功能,成员函数可以被添加.隐藏,也可合并以得到新的功能. STL提供了三个容器适配器:queue.priority_queue ...

  10. 【原】visual studio添加现有文件夹的方法

    由于使用版本管理器协调工作,有时同事就直接上传文件夹了,但右键添加现有项时不能添加文件夹的. 在工具栏"项目"下面有个"显示所有文件",选择这个,整个工程的文件 ...