From Tyvj Guest

[haoi2012]道路

 
     
     
  描述 Description  
  C国有n座城市,城市之间通过m条单向道路连接。一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小。两条最短路不同,当且仅当它们包含的道路序列不同。我们需要对每条道路的重要性进行评估,评估方式为计算有多少条不同的最短路经过该道路。现在,这个任务交给了你。
     
     
  输入格式 Input Format  
  第一行包含两个正整数n、m
接下来m行每行包含三个正整数u、v、w,表示有一条从u到v长度为w的道路
     
     
  输出格式 Output Format  
  输出应有m行,第i行包含一个数,代表经过第i条道路的最短路的数目对1000000007取模后的结果
     
     
     
 
样例输入
4 4
1 2 5
2 3 5
3 4 5
1 4 8
样例输出
2
3
2
1
 
最后的代码
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define pa pair<int,int>
const int mymod=;
const int bign=;
int n,m;
struct wtff{
int y;
int next;
int zhi;
}wtf[];
int head[]={};
int tail=;
long long ans[]={};
long long a[]={};
long long b[]={};
int c[]={};
long long dis[]={};
bool vis[]={};
void init(int x,int y,int zhi){
wtf[++tail].next=head[x];
wtf[tail].zhi=zhi;
wtf[tail].y=y;
head[x]=tail;
}
void jiuming(int st){
priority_queue< pa,vector<pa>,greater<pa> >q;
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++){
dis[i]=bign;
}
dis[st]=;
q.push(make_pair(,st));
int cn=;
while(!q.empty()){
int x=q.top().second;
q.pop();
if(vis[x]){
continue;
}
vis[x]=;
c[++cn]=x;
for(int i=head[x];i!=;i=wtf[i].next){
int y;
y=wtf[i].y;
if(dis[x]+wtf[i].zhi<dis[y]){
dis[y]=dis[x]+wtf[i].zhi;
q.push(make_pair(dis[y],y));
}
}
}
memset(a,,sizeof(a));
memset(b,,sizeof(b));
a[st]=;
for(int i=;i<=cn;i++){
b[c[i]]=;
}
for(int i=;i<=cn;i++){
for(int w=head[c[i]];w!=;w=wtf[w].next){
int y=wtf[w].y;
if(dis[c[i]]+wtf[w].zhi==dis[y]){
a[y]+=a[c[i]];
if(a[y]>mymod){
a[y]%=mymod;
}
}
}
}
for(int i=cn;i>=;i--){
for(int w=head[c[i]];w!=;w=wtf[w].next){
int y=wtf[w].y;
if(dis[c[i]]+wtf[w].zhi==dis[y]){
b[c[i]]+=b[y];
if(b[c[i]]>mymod){
b[c[i]]%=mymod;
}
}
}
}
for(int i=;i<=n;i++){
for(int w=head[i];w!=;w=wtf[w].next){
int y=wtf[w].y;
if(dis[i]+wtf[w].zhi==dis[y]){
ans[w]+=(a[i]*b[y]);
if(ans[w]>mymod){
ans[w]%=mymod;
}
}
}
}
}
int main(){
cin>>n>>m;
for(int i=;i<=m;i++){
int a1,b1,c1;
cin>>a1>>b1>>c1;
init(a1,b1,c1);
}
for(int i=;i<=n;i++){
jiuming(i);
}
for(int i=;i<=m;i++){
cout<<ans[i]<<endl;
}
return ;
}

http://www.cnblogs.com/zyfzyf/p/3995257.html

完全没有进展,迪杰斯特拉部分的堆之类的大部分看不懂,加油啃。。。
几乎是抄着代码过的,还要自己再写一遍.....
 
大概算是理解时候的备注
c指代经过其他点得到最短路的点
 
dijkstra算法可以在算出最短路的同时将点的源点的距离排序,然后按照这个
从前往后枚举在最短路上的边可以得到源点到每个点的最短路的数目,记为a[i]
从后往前枚举在最短路上的边可以得到经过每个点有多少条最短路,记为b[i] 
然后对于每条边就是 +=a[e[i].from]*b[e[i].go]
↑大神的方法...
 
 
用小根堆写迪杰斯特拉来记录c...我觉得我永远想不出来这么神奇的方法QAQ
最后的三个出答案的循环太难写+难理解了,垃圾如我:D
磕磕绊绊最后还是码出来了;
大概学到了一些小知识?
pair相当于把两个数据整合成一个数据,就像结构体一样,第一个是first,第二个是second;
定义→pair <数据类型,数据类型> 变量名;
具体↑
greater<>里面可以用pair,比较的是第一个数据,如果第一个数据一样就比较第二个;
其他大概是加深了对邻接表的理解????
 

JZYZOJ1525 HAOI2012道路 堆优化的dijkstra+pair的更多相关文章

  1. 堆优化的Dijkstra

    SPFA在求最短路时不是万能的.在稠密图时用堆优化的dijkstra更加高效: typedef pair<int,int> pii; priority_queue<pii, vect ...

  2. POJ1797 Heavy Transportation (堆优化的Dijkstra变形)

    Background Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand bus ...

  3. 朴素版和堆优化版dijkstra和朴素版prim算法比较

    1.dijkstra 时间复杂度:O(n^2) n次迭代,每次找到距离集合S最短的点 每次迭代要用找到的点t来更新其他点到S的最短距离. #include<iostream> #inclu ...

  4. 学习笔记·堆优化$\mathscr{dijkstra}$

    嘤嘤嘤今天被迫学了这个算法--其实对于学习图论来说我内心是拒绝的\(\mathscr{qnq}\) 由于发现关于这个\(\mathscr{SPFA}\)的时间复杂度\(O(kE)\)中的\(k \ap ...

  5. 堆优化的dijkstra算法

    #include<bits/stdc++.h> using namespace std; #define ll long long #define P pair<int,int> ...

  6. 【模板】堆优化的dijkstra

    生命算法,以防忘记 #include<bits/stdc++.h> using namespace std; int head[200005],dis[200005],n,m,s,f,g, ...

  7. 洛谷 P1462 通往奥格瑞玛的道路(二分答案,堆优化dijkstra)

    传送门 解题思路 首先看题目问题,求经过的所有城市中最多的一次收取的费用的最小值是多少.一看“最大值最小”就想到了二分答案. 在读一遍题目,就是二分收取的费用,然后对于每一个二分的费用,跑一边最短路, ...

  8. POJ-2387.Til the Cows Come Home.(五种方法:Dijkstra + Dijkstra堆优化 + Bellman-Ford + SPFA + Floyd-Warshall)

    昨天刚学习完最短路的算法,今天开始练题发现我是真的菜呀,居然能忘记邻接表是怎么写的,真的是菜的真实...... 为了弥补自己的菜,我决定这道题我就要用五种办法写出,并在Dijkstra算法堆优化中另外 ...

  9. 【51nod1443】路径和树(堆优化dijkstra乱搞)

    点此看题面 大致题意:给你一个无向联通图,要求你求出这张图中从u开始的权值和最小的最短路径树的权值之和. 什么是最短路径树? 从\(u\)开始到任意点的最短路径与在原图中相比不变. 题解 既然要求最短 ...

随机推荐

  1. Freemarker代码生成器原理说明

    一.Freemarker基本原理: FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用 ...

  2. 【leetcode 简单】第三题 回文数

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...

  3. 从python入门ruby

    1.Ruby的函数可以不使用括号 def h(name) puts "hello #{name}" end h "jack" 2.python可以直接访问实例的 ...

  4. Ubuntu 下 CodeBlocks 修改用户自定义颜色主题 及 更新CodeBlocks到最新版本

    Code::Blocks默认的白色编辑器界面看久了眼睛很累, 所以想换成dark的主题, 眼睛会舒服些. 1. 安装好codeblocks后, 先运行一次, 关闭, 这时程序会提示你是否要保存defa ...

  5. vc6列表框多选时,获取哪些项被选中

    //vc6列表框多选时,获取哪些项被选中...... void CWebcyzDlg::OnButton2() { int n = m_mylist1.GetSelCount();//首先获取一共有多 ...

  6. B - GuGuFishtion(莫比乌斯 欧拉函数 预处理mu函数的欧拉函数的模板)

    题目链接:https://cn.vjudge.net/contest/270608#problem/B 题目大意:题目中说,就是对欧拉函数的重新定义的一种函数的求和. 证明方法: AC代码: #inc ...

  7. 导航狗IT周报-2018年05月27日

    原文链接:https://www.daohanggou.cn/2018/05/27/it-weekly-9/ 摘要: “灰袍技能圈子”将闭圈:物理安全:为什么我们现在的生活节奏越来越快? 技术干货 1 ...

  8. ISG2018 web题Writeup

    0x01.命令注入 这题可以使用burpsuite扫出来,但是可能需要测一下. 得知payload为:i%7cecho%20gzavvlsv9c%20q9szmriaiy%7c%7ca%20%23'% ...

  9. python不可以打印.doc文件

    [背景] 需求: 打印word文件 模块: python-docx [问题] 传递xxx.doc文件给python脚本,执行后,控制台没有内容输出 经查询后了解到,大致理由: doc是早一代的word ...

  10. mybatis注解使用

    spring整合mybatis时,要使用mybatis的注解,需要spring-config.xml文件中添加下述配置: <!--下述配置指明了我们的Mapper,即Dao,在相应的包里也就可以 ...