【POJ】2449 Remmarguts' Date(k短路)

來源:互聯網
上載者:User

標籤:des   blog   http   os   io   for   ar   div   log   

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到t的某個最優路線,將他們統統加入到堆)

當到達t的點數累計到了k,那麼直接輸出g值,如果s==t的話,k要先+1再進行astar(因為當s==t的時候,不經過一條邊就滿足了一個最短路,但這條路不能算,所以要剪掉,那麼也就是k要加上1)

 

為什麼呢。。。

因為我們每次操作就相當於拿出一條邊,然後匹配它到t的最優路線形成一條s到t的路線。。。哎呀,自己慢慢理解。

#include <cstdio>#include <cstring>#include <cmath>#include <string>#include <iostream>#include <algorithm>#include <queue>using namespace std;#define rep(i, n) for(int i=0; i<(n); ++i)#define for1(i,a,n) for(int i=(a);i<=(n);++i)#define for2(i,a,n) for(int i=(a);i<(n);++i)#define for3(i,a,n) for(int i=(a);i>=(n);--i)#define for4(i,a,n) for(int i=(a);i>(n);--i)#define CC(i,a) memset(i,a,sizeof(i))#define read(a) a=getint()#define print(a) printf("%d", a)#define dbg(x) cout << #x << " = " << x << endl#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<‘0‘||c>‘9‘; c=getchar()) if(c==‘-‘) k=-1; for(; c>=‘0‘&&c<=‘9‘; c=getchar()) r=r*10+c-‘0‘; return k*r; }inline const int max(const int &a, const int &b) { return a>b?a:b; }inline const int min(const int &a, const int &b) { return a<b?a:b; }const int oo=1000000000, N=1005, M=100005;int h[N], ihead1[N], ihead2[N], cnt1, cnt2, vis[N], n, m;struct astr {int v, g, f;const bool operator< (const astr &b) const {return f==b.f?(g>b.g):(f>b.f);}};struct ED { int v, next, w; }e1[M], e2[M];priority_queue<astr> pq;queue<int> q;inline void add(const int &u, const int &v, const int &w) {e1[++cnt1].next=ihead1[u]; ihead1[u]=cnt1; e1[cnt1].v=v; e1[cnt1].w=w;e2[++cnt2].next=ihead2[v]; ihead2[v]=cnt2; e2[cnt2].v=u; e2[cnt2].w=w;}void spfa(const int &s) {int u;for1(i, 1, n) h[i]=oo;CC(vis, 0);h[s]=0; vis[s]=1; q.push(s);while(!q.empty()) {u=q.front(); q.pop(); vis[u]=0;for(int i=ihead2[u]; i; i=e2[i].next) if(h[u]+e2[i].w<h[e2[i].v]) {h[e2[i].v]=h[u]+e2[i].w;if(!vis[e2[i].v]) { vis[e2[i].v]=1; q.push(e2[i].v); }}}}int getans(const int &s, const int &t, int k) {if(h[s]==oo) return -1;if(s==t) ++k;while(!pq.empty()) pq.pop();int num=0;astr now, tp; now.v=s; now.g=0; now.f=now.g+h[now.v];pq.push(now);while(!pq.empty()) {now=pq.top(); pq.pop();if(now.v==t) ++num;if(num==k) return now.g;for(int i=ihead1[now.v]; i; i=e1[i].next) {tp.v=e1[i].v; tp.g=now.g+e1[i].w; tp.f=tp.g+h[tp.v];pq.push(tp);}}return -1;}int main() {while(~scanf("%d%d", &n, &m)) {int u, v, w;cnt1=cnt2=0; CC(ihead1, 0); CC(ihead2, 0);rep(i, m) {read(u); read(v); read(w);add(u, v, w);}read(u); read(v); read(w);spfa(v);printf("%d\n", getans(u, v, w));}return 0;}

 

 

 

 

 

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.InputThe 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).OutputA 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 21 2 52 1 41 2 2
Sample Output
14
SourcePOJ Monthly,Zeyuan Zhu

 

【POJ】2449 Remmarguts' Date(k短路)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.