1. 程式人生 > >cogs 牛跑步A*/topsort (k短路)WD

cogs 牛跑步A*/topsort (k短路)WD

names gen def input put ace pri print 程序

題目描述 Description

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_i到Y_i 的路經和它們的長度(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).

題名: cowjog

輸入描述 Input Description

輸入格式:

  • 第1行: 3個數: N, M, 和K

  • 第 2..M+1行: 第 i+1 行包含3個數 X_i, Y_i, 和 D_i, 表示一條下坡的路.

輸出描述 Output Description

輸出格式:

  • 第1..K行: 第i行包含第i最短路經的長度,或-1如果這樣的路經不存在.如果多條路經有同樣的長度,請註意將這些長度逐一列出.

樣例輸入 Sample Input

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
樣例輸出 Sample Output

2
2
3
6
7
-1
 1 #include <cstdio>
 2 #include <queue>
 3 #include <stack>
 4 
 5 using namespace std;
6 7 priority_queue<int> que[1005]; 8 int n,m,k,ind[1005]; 9 int head[1005],sz=1; 10 11 struct E { 12 int to,w,nxt; 13 } ed[10005]; 14 15 void add_edge(int u,int v,int c) 16 { 17 ed[sz].to=v; 18 ed[sz].w=c; 19 ed[sz].nxt=head[u]; 20 head[u]=sz++; 21 } 22 23 stack<int> S; 24 int tmp[105],t=0; 25 26 void topo() 27 { 28 for (int i=1; i<=n; i++) if (!ind[i]) S.push(i); 29 que[n].push(0); 30 while (!S.empty()) 31 { 32 int v=S.top(); 33 S.pop(); 34 if (v==1) break;//zui hou 1 ru jie shu 35 t=0; 36 while (!que[v].empty()) 37 { 38 tmp[++t]=que[v].top();//da gen 39 que[v].pop(); 40 } 41 for (int i=head[v]; i; i=ed[i].nxt) 42 { 43 int p=ed[i].to; 44 for (int j=1; j<=t; j++) 45 que[p].push(ed[i].w+tmp[j]); 46 while (que[p].size()>k) 47 que[p].pop(); 48 if (!--ind[p]) S.push(p); 49 } 50 } 51 int r=k-que[1].size(); 52 t=0; 53 while (!que[1].empty()) 54 { 55 tmp[++t]=que[1].top(); 56 que[1].pop(); 57 } 58 while (t) 59 printf("%d\n",tmp[t--]); 60 61 for (int i=0; i<r; i++) printf("-1\n"); 62 } 63 64 int main() 65 { 66 67 68 scanf("%d%d%d",&n,&m,&k); 69 int a,b,c; 70 for (int i=1; i<=m; i++) 71 { 72 scanf("%d%d%d",&a,&b,&c); 73 add_edge(a,b,c); 74 ind[b]++;//->b; 75 } 76 topo(); 77 return 0; 78 }

cogs 牛跑步A*/topsort (k短路)WD