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. c#中执行多条sql语句【ORA-00911: 无效字符】

    问题描述: 在plsql里执行多条sql语句的时候,使用“,”(逗号)分隔,测试可以执行多条,而在C#执行多条sql语句的时候[ORA-00911: 无效字符]. 有时我们需要一次性执行多条sql语句 ...

  2. Spring中Quartz调度器的使用

    一.Quartz的特点 * 按作业类的继承方式来分,主要有以下两种: 1.作业类继承org.springframework.scheduling.quartz.QuartzJobBean类的方式 2. ...

  3. HTML5 学习笔记 1

    1.音频.视频 <!DOCTYPE HTML> <html> <body> <audio controls="controls"> ...

  4. C# 基础 计算平均值的方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. [.ashx檔?泛型处理例程?]基础入门#1....能否用中文教会我?别说火星文?

    原文出處  http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/20/ashx_beginner_01.aspx [.ashx檔?泛型处理例程? ...

  6. C# 笛卡尔积

    void Main() { string[] str1 = { "a", "b" }; " }; string[] str3 = { "一& ...

  7. android ping网络是否成功

    public static boolean pingHost(String str) { //str 为要ping的IP地址 boolean result = false; try { Process ...

  8. Linux之kernal分析与启动20160610

    说一下LINUX内核的分析与启动: 一. 内核启动流程,据此配置内核(机器ID) 1.1 修改Makefile 1.2 选择默认配置 : make s3c2410_defconfig 1.3 make ...

  9. DTAP street

    一个网站程序的上线一般要经过开发[Development]测试[Testing]验收[Acceptance]生产[Production].所以又叫做DTAP street.对应有开发环境.测试环境.验 ...

  10. 观察者模式学习--使用jdk的工具类简单实现

    观察者模式学习之二:使用jdk的自带的工具类实现,与自己实现相比,两者有以下的区别: 1,自己实现,需要定义观察者的接口类和目标对象的接口类.使用java util的工具类,则不需要自己定义观察者和目 ...