日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

bzoj2561: 最小生成树

發(fā)布時(shí)間:2024/4/17 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj2561: 最小生成树 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

如果出現(xiàn)在最小生成樹(shù)上,那么此時(shí)比該邊權(quán)值小的邊無(wú)法連通uv。據(jù)此跑最小割(最大流)即可。

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define rep(i,n) for(int i=1;i<=n;i++) #define clr(x,c) memset(x,c,sizeof(x)) int read(){int x=0;char c=getchar();bool f=true;while(!isdigit(c)) {if(c=='-') f=false;c=getchar();}while(isdigit(c)) x=x*10+c-'0',c=getchar();return f?x:-x; } const int nmax=20005; const int maxn=200005; const int inf=0x7f7f7f7f; struct Edge{int from,to,cap;bool operator<(const Edge&rhs)const{return cap<rhs.cap;} }; Edge Edges[maxn]; struct edge{int to,cap;edge *next,*rev; }; edge edges[maxn<<2],*pt,*head[nmax],*p[nmax],*cur[nmax]; void add(int u,int v,int d){pt->to=v;pt->cap=d;pt->next=head[u];head[u]=pt++; } void adde(int u,int v,int d){add(u,v,d);add(v,u,0);head[u]->rev=head[v];head[v]->rev=head[u]; } int cnt[nmax],h[nmax]; int maxflow(int s,int t,int n){clr(cnt,0);clr(h,0);cnt[0]=n;int flow=0,a=inf,x=s;edge *e;while(h[s]<n){for(e=cur[x];e;e=e->next) if(e->cap>0&&h[e->to]+1==h[x]) break;if(e){p[e->to]=cur[x]=e;a=min(a,e->cap);x=e->to;if(x==t){while(x!=s) p[x]->rev->cap+=a,p[x]->cap-=a,x=p[x]->rev->to;flow+=a,a=inf;}}else{if(!--cnt[h[x]]) break;h[x]=n;for(e=head[x];e;e=e->next) if(e->cap>0&&h[e->to]+1<h[x]) h[x]=h[e->to]+1,cur[x]=e;cnt[h[x]]++;if(x!=s) x=p[x]->rev->to;}}return flow; } int main(){int n=read(),m=read(),s,t,d;rep(i,m) Edges[i].from=read(),Edges[i].to=read(),Edges[i].cap=read();s=read(),t=read(),d=read();sort(Edges+1,Edges+m+1); // rep(i,m) printf("%d %d %d\n",Edges[i].from,Edges[i].to,Edges[i].cap);pt=edges;clr(head,0);rep(i,m){if(Edges[i].cap>=d) break;Edge&o=Edges[i];adde(o.from,o.to,1);adde(o.to,o.from,1);}int ans=maxflow(s,t,n);pt=edges;clr(head,0);for(int i=m;i;i--){if(Edges[i].cap<=d) break;Edge&o=Edges[i];adde(o.from,o.to,1);adde(o.to,o.from,1);}ans+=maxflow(s,t,n);printf("%d\n",ans);return 0; }

 

2561: 最小生成樹(shù)

Time Limit:?10 Sec??Memory Limit:?128 MB
Submit:?1459??Solved:?716
[Submit][Status][Discuss]

Description

 給定一個(gè)邊帶正權(quán)的連通無(wú)向圖G=(V,E),其中N=|V|,M=|E|,N個(gè)點(diǎn)從1到N依次編號(hào),給定三個(gè)正整數(shù)u,v,和L (u≠v),假設(shè)現(xiàn)在加入一條邊權(quán)為L(zhǎng)的邊(u,v),那么需要?jiǎng)h掉最少多少條邊,才能夠使得這條邊既可能出現(xiàn)在最小生成樹(shù)上,也可能出現(xiàn)在最大生成樹(shù)上?

Input

?

?

?

?

 第一行包含用空格隔開(kāi)的兩個(gè)整數(shù),分別為N和M;
  接下來(lái)M行,每行包含三個(gè)正整數(shù)u,v和w表示圖G存在一條邊權(quán)為w的邊(u,v)。
  最后一行包含用空格隔開(kāi)的三個(gè)整數(shù),分別為u,v,和 L;
  數(shù)據(jù)保證圖中沒(méi)有自環(huán)。

Output

 輸出一行一個(gè)整數(shù)表示最少需要?jiǎng)h掉的邊的數(shù)量。

Sample Input

3 2
3 2 1
1 2 3
1 2 2

Sample Output

1

HINT

?

對(duì)于20%的數(shù)據(jù)滿足N ≤ 10,M ≤ 20,L ≤ 20;

  對(duì)于50%的數(shù)據(jù)滿足N ≤ 300,M ≤ 3000,L ≤ 200;

  對(duì)于100%的數(shù)據(jù)滿足N ≤ 20000,M ≤ 200000,L ≤ 20000。

?

Source

2012國(guó)家集訓(xùn)隊(duì)Round 1 day1

[Submit][Status][Discuss]

轉(zhuǎn)載于:https://www.cnblogs.com/fighting-to-the-end/p/5657280.html

總結(jié)

以上是生活随笔為你收集整理的bzoj2561: 最小生成树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。