HDU1688(Sightseeing)
题目链接:传送门
题目大意:给你一幅图(单向边),找出从起点到终点有多少条不同路径(最短路或者比最短路长度大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)的更多相关文章
- POJ 1637 Sightseeing tour
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9276 Accepted: 3924 ...
- 【POJ3621】Sightseeing Cows
Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8331 Accepted: 2791 ...
- poj1637 Sightseeing tour
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8859 Accepted: 3728 ...
- POJ 1637 Sightseeing tour (混合图欧拉路判定)
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6986 Accepted: 2901 ...
- POJ 1637 Sightseeing tour (混合图欧拉回路)
Sightseeing tour Description The city executive board in Lund wants to construct a sightseeing tou ...
- 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 ...
- Sightseeing tour
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8276 Accepted: 3489 Desc ...
- HDU 1688 Sightseeing
题目链接:Sightseeing 题意:求最短路和比最短路长度+1的所有路径条数. 附代码:用数组记录最短和次短路径的长度和条数,一次更新,直到没有边可以更新. #include <stdio. ...
- URAL 1004 Sightseeing Trip(最小环)
Sightseeing Trip Time limit: 0.5 secondMemory limit: 64 MB There is a travel agency in Adelton town ...
随机推荐
- 两列布局(浮动、定位、flex)和三列布局(圣杯、双飞翼、flex)
demo 各种布局演示 https://jsfiddle.net/mayufo/qp890peq/1/ 两栏布局 浮动 <div class="box1"> <d ...
- 倍福TwinCAT(贝福Beckhoff)应用教程12.1 TwinCAT控制松下伺服 连接和试运行
首先是用松下伺服自带的软件可以测试运行(驱动器,电机都连接好,然后用USB线连接到松下伺服驱动器的X1口),打开调试软件会自动提示连接到伺服 一般需要对驱动器清除绝对值编码器数据(驱动器可能报错4 ...
- 微信小程序 - 多地点标识(map)
演示如下: wxml <map id="map" scale="{{scale}}" controls="{{controls}}" ...
- lombok使用总结
前提 这篇文章主要介绍lombok的使用,至于lombok的源码和原理暂不探究,可以看上一篇文章插件化注解处理API去了解lombok的基本原理.参考资料: lombok官网 lombok官方教程-l ...
- cocos2d-x 重力感应 加速器的使用
CSDN开通已有两三年,今天作为一名刚入行的菜鸟写下自己的第一篇Blog. 刚好项目中须要用到重力感应,google下发现重力感应的使用很easy. 例如以下: 第一步: 在当前层开启重力感应.函数: ...
- Openfiler 之Linux 安装ISCSI initiator和自动挂载
OPENFILER做TARGET,RED HAT做客户端,如果默认没有安装ISCSI initiator的话,可以在光盘上找到RPM包直接安装.service iscsi start,启动服务,ser ...
- 用gradle把springboot项目打包成jar
``` 用gradle把springboot项目打包成jar ```### build.gradle 中添加 buildscript { repositories { mavenLocal() mav ...
- wxPython 4.0.0b2安装
https://www.cnblogs.com/NanShan2016/p/5518235.html 亮的界面是一个GUI程序必不可少的一部分,wxPython可以做到这一点,加之Python强大的功 ...
- Pycharm快捷键小结
1.编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性)Ctrl + Alt + Space 快速导入任意类Ctrl + Shift + Enter 语句完成Ctrl + ...
- LNMP平滑升级nginx并安装ngx_lua模块教程
#ngx_lua module项目地址 https://github.com/chaoslawful/lua-nginx-module 在LNMP安装包后,重编译nginx,并添加ngx_lua模块 ...