BZOJ 1579 道路公升級 DP 最短路

2022-05-15 19:06:39 字數 1426 閱讀 3899

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終於決定走在一起,他們不想浪費在一起的每一分每一秒,所以他們決定每天早上一同晨練來享受在一起的時光.他們畫出了晨練路線的草圖,...