time limit: 20 sec
memory limit: 512 mb
submit: 524
solved: 325 [
submit][
status][
discuss]
學過圖論的同學都知道最小割的概念:對於乙個圖,某個對圖中結點的劃分將圖中所有結點分成
兩個部分,如果結點s,t不在同乙個部分中,則稱這個劃分是關於s,t的割。對於帶權圖來說,將
所有頂點處在不同部分的邊的權值相加所得到的值定義為這個割的容量,而s,t的最小割指的是在
關於s,t的割中容量最小的割。
而對衝刺noi競賽的選手而言,求帶權圖中兩點的最小割已經不是什麼難事了。我們可以把
視野放寬,考慮有n個點的無向連通圖中所有點對的最小割的容量,共能得到n(n−1)
2個數值。
這些數值中互不相同的有多少個呢?這似乎是個有趣的問題。
輸入檔案第一行包含兩個數n,m,表示點數和邊數。接下來m行,每行三個數u,v,w,
表示點u和點v(從1開始標號)之間有條邊權值是w。
1<=n<=850 1<=m<=8500 1<=w<=100000
輸出檔案第一行為乙個整數,表示個數。
4 41 2 3
1 3 6
2 4 5
3 4 43
[ submit][
status][
discuss]
構建一棵最小割樹即可
傳送門
dinic打殘了。。
#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
const int maxn = 1e3 + 10;
const int maxm = 1e5 + 10;
const int inf = ~0u>>1;
struct e
e(int to,int cap,int flow): to(to),cap(cap),flow(flow){}
}edgs[maxm];
int n,m,s,t,cur[maxn],l[maxn],fa[maxn],va[maxn]
,cnt,cnt,x[maxm],y[maxm],w[maxm],vis[maxn];
vector v[maxn];
queue q;
void add(int x,int y,int cap)
bool bfs()
} return vis[t] == cnt;
}int dicnic(int x,int a)
if (!flow) l[x] = -1;
return flow;
}int getint()
int main()
for (int i = 2; i <= n; i++) fa[i] = 1;
for (int i = 2; i <= n; i++)
va[i] = maxflow;
for (int j = i + 1; j <= n; j++)
if (fa[j] == fa[i] && vis[j] == cnt)
fa[j] = i;
for (int i = 0; i < cnt; i++)
edgs[i].flow = 0;
} sort(va + 2,va + n + 1);
int ans = 0;
va[1] = -inf;
for (int i = 2; i <= n; i++)
if (va[i] != va[i-1])
++ans;
cout << ans;
return 0;
}
bzoj4519 CQOI2016 不同的最小割
time limit 20 sec memory limit 512 mb submit 418 solved 254 submit status discuss 學過圖論的同學都知道最小割的概念 對於乙個圖,某個對圖中結點的劃分將圖中所有結點分成 兩個部分,如果結點s,t不在同乙個部分中,則稱這個...
bzoj4519 Cqoi2016 不同的最小割
bzoj4519 cqoi2016 不同的最小割 題目在這裡呀 這是我第一次遇到最小割樹,特地寫乙個題解來記憶一下啊。話說12月份好像好久沒更博了ww 最小割樹 分治 最小割 此題的要求嘛就是求兩兩點對之間不同的最小割有幾種。再概括一下就是把n個點分成兩部分,最小割就是兩個部分的點之間的連邊之和,求...
CQOI2016 不同的最小割
前置芝士 最小割樹 對於一張帶權無向聯通圖 g v,e g v,e g v,e 來說,我們定義 f u v f u,v f u,v 表示 u,v u,v u,v 之間的最小割的大小。可以證明存在一顆 v v v 個節點的樹,令 g u v g u,v g u,v 表示樹上 u v u v u v 路...