time limit: 10 sec memory limit: 64 mb
submit: 2206 solved: 622
[submit][status][discuss]
每天,農夫john需要經過一些道路去檢查牛棚n裡面的牛. 農場上有m(1<=m<=50,000)條雙向泥土道路,編號為1..m. 道路i連線牛棚p1_i和p2_i (1 <= p1_i <= n; 1 <= p2_i<= n). john需要t_i (1 <= t_i <= 1,000,000)時間單位用道路i從p1_i走到p2_i或者從p2_i 走到p1_i 他想更新一些路經來減少每天花在路上的時間.具體地說,他想更新k (1 <= k <= 20)條路經,將它們所須時間減為0.幫助fj選擇哪些路經需要更新使得從1到n的時間盡量少.
* 第一行: 三個空格分開的數: n, m, 和 k * 第2..m+1行: 第i+1行有三個空格分開的數:p1_i, p2_i, 和 t_i
* 第一行: 更新最多k條路經後的最短路經長度.
4 4 1
1 2 10
2 4 10
1 3 1
3 4 100
1k是1; 更新道路3->4使得從3到4的時間由100減少到0. 最新最短路經是1->3->4,總用時為1單位. n<=10000
f [ i ] [ j ] 表示修改了 i 次,從 1 到 i 的最短路。。。
然後做法就很顯然了。。。每次先列舉修改哪條邊,然後跑一遍最短路。。。
之前寫spfa莫名**。。最後只好用dijkstra水過。。。。。。
#include#include#include#include#include#include#include#define n 2000050
#define ll long long
using namespace std;
int n,m,k,cnt=0;
struct edgee[200000];
bool vis[n];
int f[n],d[n];
int hed[n];
void insert(int u,int v,int w)
priority_queue,vector>,greater> >q;
void spfa()
int now;
ll g;
while( !q.empty() ){
now=q.top().second;
g=q.top().first;
q.pop();
if(vis[now])continue;
vis[now]=1;
for(int i=hed[now];i;i=e[i].nxt){
if(vis[e[i].r])continue;
if(e[i].v+gthis passage is made by iscream-2001.
bzoj1579 道路公升級
每天,農夫john需要經過一些道路去檢查牛棚n裡面的牛.農場上有m 1 m 50,000 條雙向泥土道路,編號為1.m.道路i連線牛棚p1 i和p2 i 1 p1 i n 1 p2 i n john需要t i 1 t i 1,000,000 時間單位用道路i從p1 i走到p2 i或者從p2 i 走到...
bzoj 3195 奇怪的道路 狀壓dp
看範圍,狀壓沒毛病 但是如果隨便連的話給開1 16,乘上n,m就爆了 所以規定轉移時只向回連邊 於是想狀態陣列 f i j 表示到i這裡i前k位的狀態為j 表示奇偶 發現有條數限制,但是n,m,2 k都比較小,加一維,f i j k 表示前i位,用j條路,i前的k位狀態為j 轉移的話,因為1 u v...
bzoj2500幸福的道路 樹形dp 單調佇列
time limit 20 sec memory limit 256 mb submit 434 solved 170 submit status discuss 小t與小l終於決定走在一起,他們不想浪費在一起的每一分每一秒,所以他們決定每天早上一同晨練來享受在一起的時光.他們畫出了晨練路線的草圖,...