【POJ】【2449】Remmarguts' Date

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++

 1 Source Code
 2 Problem: 2449        User: sdfzyhy
 3 Memory: 11260K        Time: 141MS
 4 Language: G++        Result: Accepted
 5
 6     Source Code
 7
 8     //POJ 2449
 9     #include<queue>
10     #include<cstdio>
11     #include<cstring>
12     #include<cstdlib>
13     #include<iostream>
14     #include<algorithm>
15     #define rep(i,n) for(int i=0;i<n;++i)
16     #define F(i,j,n) for(int i=j;i<=n;++i)
17     #define D(i,j,n) for(int i=j;i>=n;--i)
18     #define pb push_back
19     using namespace std;
20     typedef long long LL;
21     inline int getint(){
22         int r=1,v=0; char ch=getchar();
23         for(;!isdigit(ch);ch=getchar()) if (ch==‘-‘) r=-1;
24         for(; isdigit(ch);ch=getchar()) v=v*10-‘0‘+ch;
25         return r*v;
26     }
27     const int N=1010,M=100010,INF=0x3f3f3f3f;
28     /*******************template********************/
29     int to[2][M],next[2][M],head[2][N],len[2][M],cnt[2];
30     void ins(int x,int y,int z,int k){
31         to[k][++cnt[k]]=y; next[k][cnt[k]]=head[k][x]; head[k][x]=cnt[k]; len[k][cnt[k]]=z;
32     }
33     #define f(i,x,k) for(int i=head[k][x],y=to[k][i];i;i=next[k][i],y=to[k][i])
34
35     int n,m,K,S,T;
36     int d[N],times[N],from[N],route[N];
37     bool vis[N];
38     typedef pair<int,int>pii;
39     #define mp make_pair
40     void dij(){
41         priority_queue<pii,vector<pii>,greater<pii> >Q;
42         memset(d,0x3f,sizeof d);
43         d[T]=0;
44         Q.push(mp(0,T));
45         while(!Q.empty()){
46             int x=Q.top().second; Q.pop();
47             if (vis[x]) continue;
48             vis[x]=1;
49             f(i,x,0)
50                 if (!vis[y] && d[y]>d[x]+len[0][i]){
51                     d[y]=d[x]+len[0][i];
52                     Q.push(mp(d[y],y));
53                 }
54         }
55     //    F(i,1,n) printf("%d ",d[i]); puts("");
56     }
57
58     struct node{
59         LL w,to;
60         bool operator < (const node &b)const {
61             return w+d[to] > b.w+d[b.to];
62         }
63     };
64     LL astar(){
65         priority_queue<node>Q;
66         memset(times,0,sizeof times);
67         if (d[S]==INF) return -1;
68         Q.push((node){0,S});
69         while(!Q.empty()){
70             LL x=Q.top().to,w=Q.top().w; Q.pop();
71     //        printf("%lld %lld\n",x,w);
72             times[x]++;
73             if (x==T && times[T]==K) return w;
74             if (times[x]>K) continue;
75             f(i,x,1) Q.push((node){w+len[1][i],y});
76         }
77         return -1;
78     }
79
80     int main(){
81     #ifndef ONLINE_JUDGE
82         freopen("2449.in","r",stdin);
83         freopen("2449.out","w",stdout);
84     #endif
85         n=getint(); m=getint();
86         F(i,1,m){
87             int x=getint(),y=getint(),z=getint();
88             ins(x,y,z,1); ins(y,x,z,0);
89         }
90         S=getint(); T=getint(); K=getint();
91         if (S==T) K++;
92         dij();
93         printf("%lld\n",astar());
94         return 0;
95     }

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

时间: 2024-10-08 16:11:03

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

最小树形图 【poj 3164 Command Network】

定义:在有向图上的最小生成树. 算法过程:和最小生成树一样,不过这个不是无向图的,但是也可以用类似的算法,最小树形图的第一个算法数朱刘算法,依据最小生成树数算法形成的. 我们知道,在最小生成树算法中,我们每次选长度最短的边,如果满足条件则加入最小生成树中,知道所有的点都在树中,最小树形图同样. 首先和最小生成树一样,首先必须保证图联通,否则不能形成最小树形图. 但是由于是有向的,而我们只要找所有点的入边中最小的入边的和就是这个图的最小树形图,但是最关键的地方在于可能形成环,我们要做的就是缩点,把

【POJ 1459 power network】

不可以理解的是,测评站上的0ms是怎么搞出来的. 这一题在建立超级源点和超级汇点后就变得温和可爱了.其实它本身就温和可爱.对比了能够找到的题解: (1)艾德蒙·卡普算法(2)迪尼克算法(3)改进版艾德蒙·卡普算法(MY METHOD) 不去管那个0ms的吧,那么(3)号算法最为美妙[它的别名是:ISAP],时间客观. 这个就算是一个ISAP的模板吧(除了输入的难看的几行外,其余均是标准的大米饼牌模板!) 1 #include<stdio.h> 2 #include<algorithm&g

【POJ 2823 Sliding Window】 单调队列

题目大意:给n个数,一个长度为k(k<n)的闭区间从0滑动到n,求滑动中区间的最大值序列和最小值序列. 最大值和最小值是类似的,在此以最大值为例分析. 数据结构要求:能保存最多k个元素,快速取得最大值,更新时删去“过期”元素和“不再有希望”的元素,安放新元素. 单调队列的基本概念百度百科讲得比较清楚了:http://baike.baidu.com/view/3771451.htm 我的大致思路是: 1. 每个元素存储为结构体,包含它的秩和值.维护最大长度为k的单调队列,保证所有元素的秩都在区间内

【POJ 3669 Meteor Shower】简单BFS

流星雨撞击地球(平面直角坐标第一象限),问到达安全地带的最少时间. 对于每颗流星雨i,在ti时刻撞击(xi,yi)点,同时导致(xi,yi)和上下左右相邻的点在ti以后的时刻(包括t)不能再经过(被封锁).安全地带为永远不会被封锁的点. 简单bfs,开始WA在把平面空间上限当成300*300,但根据题目,这只是有流星雨撞击的范围.实际可走的空间理论上没上限,但分析可得,离原点最近的安全地带一定在(302,302)范围内,所以应可把数组至少开为303*303. 后来WA在把G[0][0]==1的情

【 POJ - 1204 Word Puzzles】(Trie+爆搜)

Word Puzzles Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10782 Accepted: 4076 Special Judge Description Word puzzles are usually simple and very entertaining for all ages. They are so entertaining that Pizza-Hut company started using t

kuangbin专题四 最短路练习【从入门到熟练】

[POJ 2253 Frogger] 这道题求从u到v中所有通路的最大边最小 我直接二分做了,但实际上这种题是最短路算法的变种,意义在于告诉我们spfa这些算法不仅能维护出最短路,稍加修改后可以维护出很多其他东西. #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<string> #include

【POJ】2449 Remmarguts&#39; Date(k短路)

http://poj.org/problem?id=2449 不会.. 百度学习.. 恩. k短路不难理解的. 结合了a_star的思想.每动一次进行一次估价,然后找最小的(此时的最短路)然后累计到k 首先我们建反向边,跑一次从汇到源的最短路,将跑出来的最短路作为估价函数h 根据f=g+h 我们将源s先走,此时实际价值g为0,估价为最短路(他们的和就是s-t的最短路) 将所有s所连的边都做相同的处理,加入到堆中(假设此时到达的点为x,那么x的g等于s到这个点的边权,因为根据最优,g+h此时是从x

poj 2449 Remmarguts&amp;#39; Date 【SPFA+Astar】【古典】

称号:poj 2449 Remmarguts' Date 意甲冠军:给定一个图,乞讨k短路. 算法:SPFA求最短路 + AStar 以下引用大牛的分析: 首先,为了说话方便,列出一些术语: 在启示式搜索中,对于每一个状态 x.启示函数 f(x) 一般是这种形式: f(x) = g(x) + h(x) 当中 g(x) 是从初始状态走到 x 所花的代价:h(x) 是从 x 走到目标状态所须要的代价的预计值. 相对于 h(x).另一个概念叫 h*(x),表示从 x 走到目标状态所须要的实际最小代价(

poj 2449 Remmarguts&#39; Date 【SPFA+Astar】【经典】

题目:poj 2449 Remmarguts' Date 题意:给出一个图,求k短路. 算法:SPFA求最短路 + AStar 下面引用大牛的分析: 首先,为了说话方便,列出一些术语: 在启发式搜索中,对于每个状态 x,启发函数 f(x) 通常是这样的形式: f(x) = g(x) + h(x) 其中 g(x) 是从初始状态走到 x 所花的代价:h(x) 是从 x 走到目标状态所需要的代价的估计值. 相对于 h(x),还有一个概念叫 h*(x),表示从 x 走到目标状态所需要的实际最小代价(当然