AHOI2008 上學路線

2022-05-09 13:30:11 字數 2327 閱讀 1440

嘟嘟嘟

這道題其實挺顯然的。

首先dijkstra跑出最短路圖,然後在最短路圖上求最小割。

正確性顯然。

需要注意的是,在新圖中新增最短路圖的邊的時候,一定是跑完dijkstra再加邊,如果邊跑dijkstra邊加邊,得到的是最短路樹,而不是。我因為這個wa了好幾發。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11

using

namespace

std;

12#define enter puts("")

13#define space putchar(' ')

14#define mem(a, x) memset(a, x, sizeof(a))

15#define rg register

16 typedef long

long

ll;17 typedef double

db;18

const

int inf = 0x3f3f3f3f;19

const db eps = 1e-8;20

const

int maxn = 505;21

const

int maxe = 1.3e5 + 5;22

inline ll read()

2327

while(isdigit(ch))

28if(last == '

-') ans = -ans;

29return

ans;30}

31 inline void

write(ll x)

3237

38int

n, m;

39struct

edge1

40e1[maxe << 1

];43

int head1[maxn], ecnt1 = -1;44

void addedge1(int x, int y, int t, int

c)45

;47 head1[x] =ecnt1;48}

4950

struct

edge2

51e2[maxe << 2

];54

int head2[maxn], ecnt2 = -1;55

void addedge2(int

from, int to, int

w)56

;58 head2[from] =ecnt2;

59 e2[++ecnt2] = (edge2);

60 head2[to] =ecnt2;61}

6263

#define pr pair64

#define mp make_pair

65bool

in[maxn];

66int

dis[maxn];

67void dijkstra(int

s)6884}

85}86}

8788

intdis2[maxn];

89bool

bfs()

90103

}104

}105

return

dis2[n];

106}

107int

cur[maxn];

108int dfs(int now, int

res)

109120

}121

return

flow;

122}

123124

intmincut()

125132

return

flow;

133}

134135

intmain()

136144 dijkstra(1

);145

for(int i = 1; i <= n; ++i)

146for(int j = head1[i]; j != -1; j =e1[j].nxt)

147if(dis[e1[j].to] == dis[i] +e1[j].t) addedge2(i, e1[j].to, e1[j].c);

148write(dis[n]), enter, write(mincut()), enter;

149return0;

150 }

view code

AHOI2008 上學路線

題意 給定乙個無向圖,刪除某些邊有一定的代價,要求刪掉使得最短路徑減小,求最小代價。首先要spfa求出起點到各個點的最短距離。對於一條權值為w,起點為i,終點為j的邊,設dis k 為起點到k點的距離,若dis j dis i w,則將該邊加入另乙個圖里,邊的容量為刪除這條邊的代價,則從起點到終點的...

AHOI2008 聚會 倍增

bzoj description y島風景美麗宜人,氣候溫和,物產豐富。y島上有n個城市,有n 1條城市間的道路連線著它們。每一條道路都連線某兩個城市。幸運的是,小可可通過這些道路可以走遍y島的所有城市。神奇的是,乘車經過每條道路所需要的費用都是一樣的。小可可,小卡卡和小yy經常想聚會,每次聚會,他...

AHOI2008 緊急集合 LCA

題目大意 給一棵樹,求三點之間最短距離,並求最短距離所在的點。題解 求出兩兩之間的lca,觀察可以發現,有兩個lca是相同的,且這個點一定在所有lca中深度最淺。畫乙個圖可以發現,集合點就是另乙個lca,因為這個點是這三個點互相路徑連線起來的公共點。至於距離,找個例子可以發現距離是dep a dep...