AHOI2008 上學路線

2022-05-07 20:57:11 字數 991 閱讀 6526

題意:給定乙個無向圖,刪除某些邊有一定的代價,要求刪掉使得最短路徑減小,求最小代價。

首先要spfa求出起點到各個點的最短距離。對於一條權值為w,起點為i,終點為j的邊,設dis[k]為起點到k點的距離,若dis[j]=dis[i]+w,則將該邊加入另乙個圖里,邊的容量為刪除這條邊的代價,則從起點到終點的最大流即為答案。

**:

#include#include#include#includeusing namespace std;

const int inf=0x3fffffff;

const int maxn=1100000;

int to[maxn],nxt[maxn],first[maxn],t[maxn],c[maxn];

int w[maxn],too[maxn],nxtt[maxn],firstt[maxn];

int n,m,ti,co,u,v,tot=1,e[maxn];

int b[maxn],cur[maxn],dis[maxn];

inline void add(int u,int v,int ti,int co)

inline void add(int u,int v,int wi)

void spfa() }}

}bool bfs()

}return b[n];

}int dfs(int root,int flow)

}return 0;

}int dinic()

return ans;

}int main()

spfa();

tot=2;

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

for(int j=first[i];j;j=nxt[j])

if(dis[to[j]]==dis[i]+t[j])

printf("%d\n%d\n",dis[n],dinic());

return 0;

}

AHOI2008 上學路線

嘟嘟嘟 這道題其實挺顯然的。首先dijkstra跑出最短路圖,然後在最短路圖上求最小割。正確性顯然。需要注意的是,在新圖中新增最短路圖的邊的時候,一定是跑完dijkstra再加邊,如果邊跑dijkstra邊加邊,得到的是最短路樹,而不是圖。我因為這個wa了好幾發。1 include2 include...

AHOI2008 聚會 倍增

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

AHOI2008 緊急集合 LCA

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