K短路/A*


  经(luo)典(ti) K短路题目= =

  K短路学习:http://www.cnblogs.com/Hilda/p/3226692.html

  流程:

  先把所有边逆向,做一遍dijkstra,得到估价函数h(x)(x到T的最短路距离)

  f(x)=g(x)+h(x)

  按f(x)维护一个堆……T第k次出堆时的g(T)即为ans

  另外,需要特判:如果S==T,k++

 Source Code
Problem: User: sdfzyhy
Memory: 11260K Time: 141MS
Language: G++ Result: Accepted Source Code //POJ 2449
#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=,M=,INF=0x3f3f3f3f;
/*******************template********************/
int to[][M],next[][M],head[][N],len[][M],cnt[];
void ins(int x,int y,int z,int k){
to[k][++cnt[k]]=y; next[k][cnt[k]]=head[k][x]; head[k][x]=cnt[k]; len[k][cnt[k]]=z;
}
#define f(i,x,k) for(int i=head[k][x],y=to[k][i];i;i=next[k][i],y=to[k][i]) int n,m,K,S,T;
int d[N],times[N],from[N],route[N];
bool vis[N];
typedef pair<int,int>pii;
#define mp make_pair
void dij(){
priority_queue<pii,vector<pii>,greater<pii> >Q;
memset(d,0x3f,sizeof d);
d[T]=;
Q.push(mp(,T));
while(!Q.empty()){
int x=Q.top().second; Q.pop();
if (vis[x]) continue;
vis[x]=;
f(i,x,)
if (!vis[y] && d[y]>d[x]+len[][i]){
d[y]=d[x]+len[][i];
Q.push(mp(d[y],y));
}
}
// F(i,1,n) printf("%d ",d[i]); puts("");
} struct node{
LL w,to;
bool operator < (const node &b)const {
return w+d[to] > b.w+d[b.to];
}
};
LL astar(){
priority_queue<node>Q;
memset(times,,sizeof times);
if (d[S]==INF) return -;
Q.push((node){,S});
while(!Q.empty()){
LL x=Q.top().to,w=Q.top().w; Q.pop();
// printf("%lld %lld\n",x,w);
times[x]++;
if (x==T && times[T]==K) return w;
if (times[x]>K) continue;
f(i,x,) Q.push((node){w+len[][i],y});
}
return -;
} int main(){
#ifndef ONLINE_JUDGE
freopen("2449.in","r",stdin);
freopen("2449.out","w",stdout);
#endif
n=getint(); m=getint();
F(i,,m){
int x=getint(),y=getint(),z=getint();
ins(x,y,z,); ins(y,x,z,);
}
S=getint(); T=getint(); K=getint();
if (S==T) K++;
dij();
printf("%lld\n",astar());
return ;
}
Remmarguts' Date
Time Limit: 4000MS   Memory Limit: 65536K
Total Submissions: 23008   Accepted: 6295

Description

"Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, he told them a story.

"Prince Remmarguts lives in his kingdom UDF – United Delta of
Freedom. One day their neighboring country sent them Princess Uyuw on a
diplomatic mission."

"Erenow, the princess sent Remmarguts a letter, informing him that
she would come to the hall and hold commercial talks with UDF if and
only if the prince go and meet her via the K-th shortest path. (in fact,
Uyuw does not want to come at all)"

Being interested in the trade development and such a lovely girl,
Prince Remmarguts really became enamored. He needs you - the prime
minister's help!

DETAILS: UDF's capital consists of N stations. The hall is numbered
S, while the station numbered T denotes prince' current place. M muddy
directed sideways connect some of the stations. Remmarguts' path to
welcome the princess might include the same station twice or more than
twice, even it is the station with number S or T. Different paths with
same length will be considered disparate.

Input

The
first line contains two integer numbers N and M (1 <= N <= 1000, 0
<= M <= 100000). Stations are numbered from 1 to N. Each of the
following M lines contains three integer numbers A, B and T (1 <= A, B
<= N, 1 <= T <= 100). It shows that there is a directed
sideway from A-th station to B-th station with time T.

The last line consists of three integer numbers S, T and K (1 <= S, T <= N, 1 <= K <= 1000).

Output

A
single line consisting of a single integer number: the length (time
required) to welcome Princess Uyuw using the K-th shortest path. If K-th
shortest path does not exist, you should output "-1" (without quotes)
instead.

Sample Input

2 2
1 2 5
2 1 4
1 2 2

Sample Output

14

Source

POJ Monthly,Zeyuan Zhu

[Submit]   [Go Back]   [Status]   [Discuss]

【POJ】【2449】Remmarguts' Date的更多相关文章

  1. 【 POJ - 1204 Word Puzzles】(Trie+爆搜|AC自动机)

    Word Puzzles Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10782 Accepted: 4076 Special ...

  2. 【POJ 1459 power network】

    不可以理解的是,测评站上的0ms是怎么搞出来的. 这一题在建立超级源点和超级汇点后就变得温和可爱了.其实它本身就温和可爱.对比了能够找到的题解: (1)艾德蒙·卡普算法(2)迪尼克算法(3)改进版艾德 ...

  3. 【POJ 2728 Desert King】

    Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 27109Accepted: 7527 Description David the ...

  4. 【POJ 2976 Dropping tests】

    Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 13849Accepted: 4851 Description In a certa ...

  5. 【POJ 3080 Blue Jeans】

    Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 19026Accepted: 8466 Description The Genogr ...

  6. 【POJ各种模板汇总】(写在逆风省选前)(不断更新中)

    1.POJ1258 水水的prim……不过poj上硬是没过,wikioi上的原题却过了 #include<cstring> #include<algorithm> #inclu ...

  7. 【POJ 3669 Meteor Shower】简单BFS

    流星雨撞击地球(平面直角坐标第一象限),问到达安全地带的最少时间. 对于每颗流星雨i,在ti时刻撞击(xi,yi)点,同时导致(xi,yi)和上下左右相邻的点在ti以后的时刻(包括t)不能再经过(被封 ...

  8. 【POJ 2823 Sliding Window】 单调队列

    题目大意:给n个数,一个长度为k(k<n)的闭区间从0滑动到n,求滑动中区间的最大值序列和最小值序列. 最大值和最小值是类似的,在此以最大值为例分析. 数据结构要求:能保存最多k个元素,快速取得 ...

  9. 【POJ 2406 Power Strings】

    Time Limit: 3000MSMemory Limit: 65536K Description Given two strings a and b we define a*b to be the ...

  10. POJ 2449:Remmarguts' Date(A* + SPFA)

    题目链接 题意 给出n个点m条有向边,源点s,汇点t,k.问s到t的第k短路的路径长度是多少,不存在输出-1. 思路 A*算法是启发式搜索,通过一个估价函数 f(p) = g(p) + h(p) ,其 ...

随机推荐

  1. Mongodb添加地理位置索引

    1.同步站点信息到mongo中(支持mysql.sqlserver数据同步) 2.在Collections文件夹下所在文档右键,在菜单中选择Add Index, 3.然后进行数据查询{ "m ...

  2. 重拾C,一天一点点_10

    来博客园今天刚好两年了,两年前开始学编程. 忙碌近两个月,项目昨天上线了,真心不容易,也不敢懈怠,接下来的问题会更多.这两天调试服务器,遇到不少麻烦. 刚出去溜达了一下,晚上天凉了,现在手感觉凉的有点 ...

  3. Java迷题:等于,还是不等于?

    等于还是不等于? 看来看下面的一段代码: public static void main(final String[] args) { Integer a = new Integer(100); In ...

  4. Py Split and Count For "PFW Impact Crusher For Sale South Africa"

    data = 'As we all know, the impact Crusher is fully used in the transportation, energy, construction ...

  5. ajax 注意点

    1. 为了把数据发送到服务器,应该使用POST 方法,为了从服务器检索数据,应该使用GET 方法. 2.ajax 完整参数, url  发送的地址 http://localhost/default.a ...

  6. 第二十章 数据访问(In .net4.5) 之 使用LINQ

    1. 概述 .net3.5中新添加给C#的LINQ查询,提供了直观便捷的数据查询方式.并且支持多种数据源的查询. 本章介绍标准的LINQ操作,如何用最优的方式使用LINQ 以及 LINQ to XML ...

  7. spring事物的七种事物传播属性行为及五种隔离级别

    首先,说说什么事务(Transaction). 事务,就是一组操作数据库的动作集合.事务是现代数据库理论中的核心概念之一.如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务.当 ...

  8. mq消息队列

    rabbitmq学习9:使用spring-amqp发送消息及同步接收消息 通过对spring-amqp看重要类的认识,下面来通过spring-amqp的发送消息及同步接收消息是如何实现的.有兴趣的朋友 ...

  9. WebApp JS 打开 app

    产品需求:分享出去的链接比如到微信朋友圈,微博的H5页面,添加一个按钮 open App 用来打开并启动自己公司的APP (如果当前手机已经安装自己公司的APP) 废话少说直接上代码: <inp ...

  10. hdu 5210 Delete

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=5210 简单题如下: #include<algorithm> #include<ios ...