题目链接:传送门

题目大意:给你一幅图(单向边),找出从起点到终点有多少条不同路径(最短路或者比最短路长度大1)

题目思路:二维dijkstra,真的是要对dijkstra理解非常透彻才行,距离数组d开成二维表示最短路与次短路,同时需要一个cnt数组,记录有多少条路径

    对于当前点有四种更新情况:

    1.if(距离<最短路) 更新最短路与次短路(包括路径数)

    2.if(距离==最短路) 更新最短路路径数

    3.if(距离<次小) 更新次短路(包括路径数)

    4.if(距离==距离) 更新次短路路径数

    

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <climits>
#define lson root<<1,l,mid
#define rson root<<1|1,mid+1,r
#define fi first
#define se second
#define seg int root,int l,int r
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
#define Min(x,y) (x<y?x:y)
#define Max(x,y) (x>y?x:y)
using namespace std;
#define gamma 0.5772156649015328606065120
#define MOD 100000007
#define inf 0x3f3f3f3f
#define N 1005
#define maxn 10001000
typedef long long LL;
typedef pair<int,int> PII; int n,x,y;
int vis[N][],d[N][];
int cnt[N][];
int head[N];
struct Node{
int to,next,v;
Node(int a=,int b=,int c=){
to=a; next=b; v=c;
}
}node[N*]; int ncnt;
struct Edge{
int x,v,fl;
Edge(int a=,int b=,int c=):x(a),v(b),fl(c){}
bool operator<(const Edge &a)const{
return v>a.v;
}
}temp,edge;
inline void add(int x,int y,int v){
node[ncnt]=Node(y,head[x],v);
head[x]=ncnt++;
} void dijkstra(){
mst(vis,);
mst(d,inf);
mst(cnt,);
cnt[x][]=;
d[x][]=;
priority_queue<Edge>q;
q.push(Edge(x,,));
while(!q.empty()){
edge=q.top();q.pop();
if(vis[edge.x][edge.fl]) continue;
int s=edge.x;
int flag=edge.fl;
vis[s][flag]=;
for(int i=head[s];~i;i=node[i].next){
int e=node[i].to;
if(d[e][]>node[i].v+d[s][flag]){ ///更新最短路与次短路
if(d[e][]>d[e][]){
d[e][]=d[e][];
cnt[e][]=cnt[e][];
q.push(Edge(e,d[e][],));
}
d[e][]=node[i].v+d[s][flag];
cnt[e][]=cnt[s][flag];
q.push(Edge(e,d[e][],));
}
else if(d[e][]==node[i].v+d[s][flag]){ ///更新最短路路径数
cnt[e][]+=cnt[s][flag];
}
else if(d[e][]>node[i].v+d[s][flag]){ ///更新次短路
d[e][]=node[i].v+d[s][flag];
cnt[e][]=cnt[s][flag];
q.push(Edge(e,d[e][],));
}
else if(d[e][]==node[i].v+d[s][flag]){ ///更新次短路路径数
cnt[e][]+=cnt[s][flag];
}
}
}
} int main(){
int i,j,group,k,m,v;
scanf("%d",&group);
while(group--){
mst(head,-);
ncnt=;
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d%d",&x,&y,&v);
add(x,y,v);
}
scanf("%d%d",&x,&y);
dijkstra();
int ans=cnt[y][];
if(d[y][]+==d[y][]) ans+=cnt[y][];
printf("%d\n",ans);
}
return ;
}

HDU1688(Sightseeing)的更多相关文章

  1. POJ 1637 Sightseeing tour

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9276   Accepted: 3924 ...

  2. 【POJ3621】Sightseeing Cows

    Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8331   Accepted: 2791 ...

  3. poj1637 Sightseeing tour

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8859   Accepted: 3728 ...

  4. POJ 1637 Sightseeing tour (混合图欧拉路判定)

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6986   Accepted: 2901 ...

  5. POJ 1637 Sightseeing tour (混合图欧拉回路)

    Sightseeing tour   Description The city executive board in Lund wants to construct a sightseeing tou ...

  6. HDU 1688 Sightseeing&HDU 3191 How Many Paths Are There(Dijkstra变形求次短路条数)

    Sightseeing Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  7. Sightseeing tour

    Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8276 Accepted: 3489 Desc ...

  8. HDU 1688 Sightseeing

    题目链接:Sightseeing 题意:求最短路和比最短路长度+1的所有路径条数. 附代码:用数组记录最短和次短路径的长度和条数,一次更新,直到没有边可以更新. #include <stdio. ...

  9. URAL 1004 Sightseeing Trip(最小环)

    Sightseeing Trip Time limit: 0.5 secondMemory limit: 64 MB There is a travel agency in Adelton town ...

随机推荐

  1. nav标签使用说明

    一.html nav标签语法与结构   -   TOP 1.基本语法 <nav>内容</nav> 2.nav加id <nav id=”abc”>内容</nav ...

  2. Json_decode:详解

    Json_decode:详解 json_decode - 对 JSON 格式的字符串进行编码   mixed json_decode ( string $json [, bool $assoc = f ...

  3. mongoDB 数据导出之mongoexport的用法

     http://tuozixuan.iteye.com/blog/1321994     实战代码: #mongo导出 mongoexport --port 33001  -d bsdf_soe -c ...

  4. duplicate symbols 错误解决方案

    duplicate symbols for architecture arm64 after xCode 8.0 update 升级xcode 8以后提示有的变量重复了,只要在 Build setti ...

  5. MySQL学习总结(五)表数据查询

    查询数据记录,是指从数据库对象表中获取所要查询的数据记录,该操作可以说是数据最基本的操作之一,也是使用频率最高.最重要的数据操作. 1.单表数据记录查询 1.1.简单数据查询 SELECT field ...

  6. tony_nginx的安装和配置

    yum安装nginx Centos默认的yum源里没有nginx,需要手动添加源,有两种方法: 使用nginx提供的一个源设置安装包 nginx下载页面:http://nginx.org/en/dow ...

  7. Silverlight实例教程 - Validation客户端同步数据验证(转载)

    摘要:在Silverlight 4中,Silverlight Validation有相对的改进,本篇将介绍Silverlight 4中新加入的验证机制功能,IDataErrorInfo客户端同步验证机 ...

  8. Codeforces Round #240 (Div. 1)B---Mashmokh and ACM(水dp)

    Mashmokh's boss, Bimokh, didn't like Mashmokh. So he fired him. Mashmokh decided to go to university ...

  9. 基于dsp_builder的算法在FPGA上的实现

    基于dsp_builder的算法在FPGA上的实现   一.摘要 结合dsp_builder.matlab.modelsim和quartus ii等软件完成算法的FPGA实现. 二.实验平台 硬件平台 ...

  10. SRIO调试(C6678->SRIO和Virtex6->FPGA)

    C6678->SRIO和Virtex6->FPGA   设计的板子到了SRIO调试阶段了,在板子上,一片V6和两片6678通过4XSRIO互联,中间没有Switch,总算搞定了相互之间的通 ...