time limit: 10 sec memory limit: 162 mb
[submit][status][discuss]
bessie準備用從牛棚跑到池塘的方法來鍛鍊.
但是因為她懶,她只準備沿著下坡的路跑到池塘, 然後走回牛棚.
bessie也不想跑得太遠,所以她想走最短的路經.
農場上一共有m 條路, 每條路連線兩個用1..n標號的地點.
更方便的是,如果x>y,則地點x的高度大於地點y的高度.
地點n是bessie的牛棚;地點1是池塘.
很快, bessie厭倦了一直走同一條路.所以她想走不同的路,更明確地講,她想找出k條不同的路經.為了避免過度勞累,她想使這k條路經為最短的k條路經.
請幫助bessie找出這k條最短路經的長度.
你的程式需要讀入農場的地圖,一些從x_i到y_i 的路經和它們的長度(x_i, y_i, d_i).
第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 112
2367
-11 <= m <= 10,000, 1 <= n <= 1000, 1 <= k <= 100
給定一張圖,輸出1~k短路的距離。
既然是求k短路,那我們使用a*搜尋,先反向建圖,記錄終點到每乙個點的最短路,然後把這個dist當做估價來跑a*即可。可以證明:第k次搜到的路即是k短路。
1 #include2 #includeview code3 #include4 #include5 #include6 #include7 #include8 #include9
using
namespace
std;
10 typedef long
long
s64;
1112
const
int one = 2e6+5;13
14int
n,m,k;
15int
s,t;
16int
dist[one],vis[one],output[one],tou,wei;
17int
next[one],first[one],go[one],w[one],tot;
18int
ans[one],num;
1920
struct
point
21a[one];
2425
struct
power
2632
};33
34 inline int
get()
3544
45void add(int u,int v,int
z)46
4950
void spfa(int
x)5167}
68 vis[u] = 0;69
}70}71
72void
astar()
73 );
76while(!q.empty())
77 );86}
87}88}
8990
intmain()
9199
spfa(t);
100101 memset(first,0,sizeof(first)); tot=0
;102
for(int i=1;i<=m;i++) add(a[i].x,a[i].y,a[i].z);
103104
astar();
105106
for(int i=1;i<=k;i++)
107 printf("
%d\n
",ans[i]!=0?ans[i]:-1
);108
109 }
牛客 烏龜跑步
有乙隻烏龜,初始在0的位置向右跑。這只烏龜會依次接到一串指令,指令t表示向後轉,指令f表示向前移動乙個單位。烏龜不能忽視任何指令。現在我們要修改其中正好n個指令 乙個指令可以被改多次,一次修改定義為把某乙個t變成f或把某乙個f變成t 求這只烏龜在結束的時候離起點的最遠距離。假設烏龜最後的位置為x,我...
牛客網 烏龜跑步 (dfs)
有乙隻烏龜,初始在0的位置向右跑。這只烏龜會依次接到一串指令,指令t表示向後轉,指令f表示向前移動乙個單位。烏龜不能忽視任何指令。現在我們要修改其中正好n個指令 乙個指令可以被改多次,一次修改定義為把某乙個t變成f或把某乙個f變成t 求這只烏龜在結束的時候離起點的最遠距離。假設烏龜最後的位置為x,我...
USACO Mar08 牛跑步 k短路
usaco mar08 牛跑步 bessie 準備用從牛棚跑到池塘的方法來鍛鍊.但是因為她懶,她只準備沿著下坡的路跑到池塘,然後走回牛棚.bessie 也不想跑得太遠,所以她想走最短的路經.農場上一共有m 1 m 10,000 條路,每條路連線兩個用1.n 1 n 1000 標號的地點.更方便的是,...