bzoj4519[cqoi2016]不同的最小割
題目在這裡呀
這是我第一次遇到最小割樹,特地寫乙個題解來記憶一下啊。(話說12月份好像好久沒更博了ww)
最小割樹=分治+最小割
此題的要求嘛就是求兩兩點對之間不同的最小割有幾種。
再概括一下就是把n個點分成兩部分,最小割就是兩個部分的點之間的連邊之和,求這個不同的和有幾個。
注意到最小割樹是針對無向圖的。
這裡就來講一下最小割樹的實現(這是道裸的最小割樹辣)
1、先將所有點放在同乙個集合中,任取兩個點(方便起見用1和n),跑一遍最小割
2、這樣就把整個集合分成了s集和t集
3、繼續更新兩個集合內的答案,按此方法遞迴下去
雖然dinic的時間複雜度是o(n^2*m),但注意到n指數級減小,所以不會t。這應該是道簡單的模板題吧。
**也很好懂的。
#include #include #include #include #include #include #include #define ll long long
#define n 860
using namespace std;
mapflag;
int head[n],dis[n],vis[n],cur[n],a[n],b[n],n,m,num,x,s,t,cnt,u,v,sum,ans,y,z;
const int inf=1e9;
struct edgee[200000+2000];
inline int read()
while (ch>='0'&&ch<='9')
return x*f;
}inline void add_edge(int u,int v,int c);head[u]=cnt;
e[++cnt]=(edge);head[v]=cnt;
}bool bfs()
} return dis[t]!=-1;
}int dfs(int x,int f)
if(!used) dis[x]=-1;
return used;
}void dinic()
}void work(int u)
}void solve(int l,int r)
for(int i=l;i<=r;i++) a[i]=b[i];
solve(l,num1-1);solve(num1,r);
}int main()
for(int i=1;i<=n;i++) a[i]=i;
solve(1,n);
printf("%d\n",ans);
return 0;
}
bzoj4519 CQOI2016 不同的最小割
time limit 20 sec memory limit 512 mb submit 418 solved 254 submit status discuss 學過圖論的同學都知道最小割的概念 對於乙個圖,某個對圖中結點的劃分將圖中所有結點分成 兩個部分,如果結點s,t不在同乙個部分中,則稱這個...
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除...