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 ...
随机推荐
- eclipse中egit插件使用(转)
1.eclipse和egit版本 eclipse使用的是kepler的SR1版,egit就是自带的那个版本,要详细的话,我就也只能把文件名贴出来了:eclipse-jee-kepler-SR1-win ...
- 树莓派之OLED12864视频播放—BadApple
代码地址如下:http://www.demodashi.com/demo/13218.html 概述 本篇教程讲述了使用树莓派驱动OLED12864液晶屏,并在液晶屏上播放动画和视频. 硬件平台 树莓 ...
- java filter、listener、servlet
listener http://www.cnblogs.com/xdp-gacl/p/3969249.html http://blog.csdn.net/java_pengjin/article/de ...
- 借鉴炉石传说的战棋游戏《DarkWar》
<炉石传说>是现在很火的休闲对战游戏,本人也非常喜欢玩,玩的时候经常想能不能把炉石的这些元素融入到战棋类游戏中,于是思索良久,又恰逢游戏蛮牛开展第三届蛮牛杯游戏开发大赛,于是用Unity3 ...
- Mac和Windows上Android Studio经常使用的快捷键
小编整理了一些Mac和Windows上超有用的Android Studio经常使用的快捷键. Ctrl(Command)+Y 删除行 Ctrl(Command)+Z 倒退 Ctrl(Command)+ ...
- 自己动手一步一步安装hadoop(含编译hadoop的native本地包)
近期项目须要用到hadoop.边学习边应用,第一步无疑是安装hadoop.我安装的是hadoop-2.4.1.以下是具体步骤,做备忘以后查看 一.下载依赖软件 1.java hadoop官网说明仅仅支 ...
- ping的原理以及ICMP
ping 的原理: ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接. ping 使用的是ICMP协议,它发送icmp回送请求消 ...
- Flex colorTranfrom使用说明
这次使用colorTranfrom主要用来将一个已有的过渡颜色映射到其他颜色条.发现这个colorTranfrom很好使用,于是简单研究了下 文档有说明: 使用 ColorTransform 类调整显 ...
- ffffff
http://www.ibm.com/developerworks/cn/linux/l-cn-linuxglb/ http://blog.csdn.net/wocjj/article/details ...
- jquery中绑定点击事件
$("body").on("click",".tab-contentBox td",function(){}; $(".tab-c ...