1. 程式人生 > >USACO2008mar-gold牛跑步(第k短路:A-star)

USACO2008mar-gold牛跑步(第k短路:A-star)

描述 BESSIE準備用從牛棚跑到池塘的方法來鍛鍊. 但是因為她懶,她只准備沿著下坡的路跑到池塘, 然後走回牛棚. BESSIE也不想跑得太遠,所以她想走最短的路經. 農場上一共有M (1 <= M <= 10,000)條路, 每條路連線兩個用1…N(1 <= N <= 1000)標號的地點. 更方便的是,如果X>Y,則地點X的高 度大於地點Y的高度. 地點N是BESSIE的牛棚;地點1是池塘. 很快, BESSIE厭倦了一直走同一條路.所以她想走不同的路,更明確地講,她想找出K (1 <= K <= 100)條不同的路經.為了避免過度勞累,她想使這K條路經為最短的K條路經. 請幫助BESSIE找出這K條最短路經的長度.你的程式需要讀入農場的地圖, 一些從X

iX_iYiY_i的路經和它們的長度(Xi,Yi,Di)(X_i,Y_i,D_i). 所有(X_i, Y_i, D_i)滿足(1 <= Y_i < X_i; Y_i < X_i <= N, 1 <= D_i <= 1,000,000). 輸入 第1行: 3個數: N, M, 和K 第 2…M+1行: 第 i+1 行包含3個數 X_i, Y_i, 和 D_i, 表示一條下坡的路. 輸出 第1…K行: 第i行包含第i最短路經的長度,或-1如果這樣的路經不存在.如果多條路經有 同樣的長度,請注意將這些長度逐一列出. 樣例輸入 5 8 7 5 4 1 5 3 1 5 2 1 5 1 1 4 3 4 3 1 1 3 2 1 2 1 1 樣例輸出 1 2 2 3 6 7 -1 提示 輸出解釋: 路經分別為(5-1), (5-3-1), (5-2-1), (5-3-2-1), (5-4-3-1), (5-4-3-2-1).

第k短路裸題。。。。

所以說A*還是不會啊。。。。。

大概就那樣吧。。。反正就是搜到第k次就那啥。。。。。亂胡一發、、、

趕緊溜。。。。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int inf=200000000;
inline int read(){
    char ch=getchar();
    int res=0;
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))res=(res<<3)+(res<<
1)+(ch^48),ch=getchar(); return res; } const int N=1005; const int M=20005; int n,m,adj[N],nxt[M],to[M],val[M],k,dis[N],ans[106],tim,head[N],len[M],nec[M],go[M],cnt,tot; bool vis[N]; inline void addedge(int u,int v,int w){ nxt[++cnt]=adj[u],adj[u]=cnt,to[cnt]=v,len[cnt]=w; nec[++tot]=head[v],head[v]=tot,go[tot]=u,val[tot]=w; } priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q; inline void dijkstra(){ for(int i=1;i<=n;i++)dis[i]=inf; dis[1]=0,vis[1]=0;q.push(make_pair(0,1)); while(!q.empty()){ int u=q.top().second;q.pop(); if(vis[u])continue;vis[u]=true; for(int e=head[u];e;e=nec[e]){ int v=go[e]; if(dis[u]+len[e]<dis[v]){ dis[v]=dis[u]+len[e],q.push(make_pair(dis[v],v)); } } } } inline void a_star(){ if(dis[n]==inf)return; q.push(make_pair(dis[n],n)); while(!q.empty()){ int u=q.top().second,w=q.top().first;q.pop(); if(u==1)ans[++tim]=w; if(tim==k)break; int v=w-dis[u]; for(int e=adj[u];e;e=nxt[e]){ q.push(make_pair(v+val[e]+dis[to[e]],to[e])); } } } int main(){ n=read(),m=read(),k=read(); for(int i=1;i<=m;i++){ int u=read(),v=read(),w=read(); addedge(u,v,w); } dijkstra(); a_star(); for(int i=1;i<=k;i++){ if(ans[i])cout<<ans[i]<<'\n'; else cout<<"-1"<<'\n'; } }