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. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  2. 【BZOJ】4764: 弹飞大爷 LCT

    [题意]给定n个数字ai,表示大爷落到i处会被弹飞到i+ai处,弹飞到>n或<1处则落地.m次操作,修改一个ai,或询问大爷落到x处经过几次落地(或-1).n,m<=10^5,|ai ...

  3. 【CodeForces】908 E. New Year and Entity Enumeration

    [题目]E. New Year and Entity Enumeration [题意]给定集合T包含n个m长二进制数,要求包含集合T且满足以下条件的集合S数:长度<=m,非和与的结果都在集合中. ...

  4. Price(洛谷P4109 [HEOI2015]定价)

    题目 思路: 按照我的思路这一题应该是这样子的 剔除+判断 剔除 因为后面的0要越多越好,所以我们判断0出现的情况,当2个数之间的差大与10时,证明2个之间会存在一个0,所以这一位我们可以把它去掉,相 ...

  5. html5手机Web单页应用实践--起点移动阅读

    一开始以hybrid形式做了一个android的小说阅读客户端,叫4G阅读.而后由于业务需求,要迅速实现纯手机html5 版的,所以就直接在原先客户端内内嵌的网页进行改版,快速实现以后在优化的过程中发 ...

  6. Java爬虫(二)

    上一篇简单的实现了获取url返回的内容,在这一篇就要第返回的内容进行提取,并将结果保存到html中.而且这个爬虫是基于python爬虫的java语言实现,其逻辑大致相同. 一 . 需求: 抓取主页面: ...

  7. linux设置时区同步时间

    linux设置时区同步时间 一.运行tzselect sudo tzselect 在这里我们选择亚洲 Asia,确认之后选择中国(China),最后选择北京(Beijing) 如图:   二.复制文件 ...

  8. ubuntu sudoers改坏了。

    pkexec bash 通过如上命令,可以进入root模式,然后恢复sudoers.前提是root账户没被禁用. precise (1) pkexec.1.gz Provided by: policy ...

  9. libuv 一 环境搭建, hello TTY

    引言 - 一时心起, libuv linux 搭建 有一天突然想起来想写个动画. 找了一下 ui 库太大. 后面想起以前弄过的 libuv. 但发现 libuv 相关资料也很少. 所以就有了这些内容. ...

  10. openstack环境下的虚拟机通过浮动IP访问后能ping通外网IP不能ping通域名

    1.环境简介 openstack环境下构造Ubuntu系统的VM,VM配置受管子网和自管子网,同时绑定浮动IP 2.通过浮动IP访问VM后,ping www.baidu.com失败,但是通过IP地址p ...