time limit: 20 sec
memory limit: 512 mb
submit: 418
solved: 254 [
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
分治+最小割樹
首先,最小割樹是針對無向圖而言的。其次,最小割樹上兩點間的最小割(路徑上的最小邊),對應的就是原圖中兩點的最小割。
所以問題就轉化成最小割樹上長度不同的邊有多少條。
這樣只要在最小割樹分治的時候加乙個判斷就可以了。
(具體實現方法見**)
#include#include#include#include#include#include#include#include#define f(i,j,n) for(int i=j;i<=n;i++)
#define d(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
#define maxn 1000
#define maxm 20000
#define inf 1000000000
using namespace std;
int n,m,s,t,ans,cnt=1;
int head[maxn],cur[maxn],dis[maxn],a[maxn],b[maxn];
bool tag[maxn];
struct edge_typee[maxm];
mapmp;
inline int read()
while (ch>='0'&&ch<='9')
return x*f;
}inline void add_edge(int x,int y,int z)
;head[x]=cnt;
e[++cnt]=(edge_type);head[y]=cnt;
}inline bool bfs()
} }return false;
}inline int dfs(int x,int f)
} if (!sum) dis[x]=-1;
return sum;
}inline void get(int x)
}inline void solve(int l,int r)
if (!mp[mxf]) ans++,mp[mxf]=true;
memset(tag,false,sizeof(tag));
get(s);
int t1=l,t2=r;
f(i,l,r)
f(i,l,r) a[i]=b[i];
solve(l,t1-1);solve(t1,r);
}int main()
f(i,1,n) a[i]=i;
solve(1,n);
printf("%d\n",ans);
}
bzoj4519 Cqoi2016 不同的最小割
bzoj4519 cqoi2016 不同的最小割 題目在這裡呀 這是我第一次遇到最小割樹,特地寫乙個題解來記憶一下啊。話說12月份好像好久沒更博了ww 最小割樹 分治 最小割 此題的要求嘛就是求兩兩點對之間不同的最小割有幾種。再概括一下就是把n個點分成兩部分,最小割就是兩個部分的點之間的連邊之和,求...
4519 Cqoi2016 不同的最小割
time limit 20 sec memory limit 512 mb submit 524 solved 325 submit status discuss 學過圖論的同學都知道最小割的概念 對於乙個圖,某個對圖中結點的劃分將圖中所有結點分成 兩個部分,如果結點s,t不在同乙個部分中,則稱這個...
bzoj1257 CQOI 餘數之和
題目 time limit 5 sec memory limit 162 mb submit 2383 solved 1105 submit status discuss 給出正整數n和k,計算j n,k k mod 1 k mod 2 k mod 3 k mod n的值,其中k mod i表示k除...