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 ...
随机推荐
- C# 关键字 Visual Studio 2012
C# 关键字 Visual Studio 2012 其他版本 关键字是对编译器具有特殊意义的预定义保留标识符. 它们不能在程序中用作标识符,除非它们有一个 @ 前缀. 例如,@if 是有效的标识符,但 ...
- PostgreSQL学习资料
我的PostgreSQL学习笔记:http://note.youdao.com/share/?id=2e882717fc3850be9af503fcc0dfe7d0&type=notebook ...
- Bat 替换文件中的字符串
echo off setlocal enabledelayedexpansion set "file=Config\__Config\server_config_common.xml&quo ...
- servlet--百度百科
Servlet(Server Applet),全称Java Servlet, 未有中文译文.是用Java编写的服务器端程序.其主要功能在于交互式地浏览和修改数据,生成动态Web内容.狭义的Servle ...
- 提高PAAS安全性的一点尝试
云服务已经成为现代人生活的一部分.手机中的照片会自己主动同步到云中:你的邮件内容保存在云中.办公软件执行在云中:你的健康数据会实时上传到云中.你每天的生活轨迹消耗的卡路里也会上传到云中:云服务也会逐渐 ...
- 【Java】Java_03第一个Java程序
第一个JAVA程序的编写和运行 1.使用记事本编辑 public class Welcome{ public static void main(String[] agrs){ System.out.p ...
- javascript 和 jquery 博客
http://www.cnblogs.com/starof/category/626164.html
- Refactoring之——代码的坏味道(一)过长方法
1 代码的坏味道 重构一书中提到了22种代码的坏味道,大致可以分为几类. 识别代码的坏味道,有助于发现代码的潜在问题,从而可以有的放矢的修改现有代码,使之不断完善. 1.1 Bloaters(臭鲱,暂 ...
- springboot学习(九) 使用mybatis访问数据库
1.添加maven依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId ...
- Atitit.java swing打印功能 api attilax总结
Atitit.java swing打印功能 api attilax总结 1. 打印方式有三种:2 1.1. 一是不经过任何修改,直接调用javascript中的window.print()打印.2 ...