題意:給定乙個無向圖,刪除某些邊有一定的代價,要求刪掉使得最短路徑減小,求最小代價。
首先要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...