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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[luogu3505][bzoj2088][POI2010]TEL-Teleportation【分层图】

發布時間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [luogu3505][bzoj2088][POI2010]TEL-Teleportation【分层图】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目大意

給出了一個圖,然后讓你加最多的邊,讓點\(1\)\(2\)之間至少要經過5條邊


解法

比較清楚,我們可以將這個圖看作一個分層圖,點\(1\)為第一層,再將\(2\)作為第五層,這樣第一層和第五層直接加邊就可以保證我們之間至少有\(5\)條邊經過了。

那么剩下的點我們還是分成\(3\)層,其中第\(2\)層為與\(1\)直接相連的節點,第\(4\)層為直接和節點\(2\)相連的節點,剩下的節點我們就放在了第\(3\)層中,那么這樣我們就做好了分層工作。

很明顯最優的方案就是每一層的節點都兩兩相連,那么我們就先將所有的點都連起來,在減掉所有不可以的邊。

什么邊是不可以的呢?比如說是重復的邊,或者是從點\(1\)連到到了\(2\)的邊,這些邊都是不可以的邊。

那么我們每次只需要保證我們連接的邊的兩個端點是\(u,v\)\(u<v\)就可以了。

若一個第三層的點連到某個第一層的點,則該點可以向第一層的所有點連邊。若一個第三層的點連到某個第四層的點,則該點可以向所有第四層的點連邊。否則的話就向節點數較多的那一層連邊就好了。

ac代碼(我丑陋的代碼)

# include <cstdio> # include <cstring> # include <algorithm> # include <ctype.h> # include <iostream> # include <cmath> # include <map> # include <vector> # include <queue> # define LL long long # define ms(a,b) memset(a,b,sizeof(a)) # define ri (register int) # define inf (0x7f7f7f7f) # define pb push_back # define fi first # define se second # define pii pair<int,int> using namespace std; inline int gi(){int w=0,x=0;char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return w?-x:x; } # define N 1000005 struct edge{int to,nt; }E[N<<1]; int cnt,n,m,s1,s2;//s1表示第2層的點數,s2表示第4層點的個數 int H[N],link[N]; void addedge(int u,int v){//加邊不說E[++cnt]=(edge){v,H[u]}; H[u]=cnt; } int main(){n=gi(),m=gi();for (int i=1;i<=m;i++){int u=gi(),v=gi();addedge(u,v); addedge(v,u);}for (int e=H[1];e;e=E[e].nt) link[E[e].to]=1,s1++;//將所有與1相連的節點計算出來for (int e=H[2];e;e=E[e].nt) link[E[e].to]=2,s2++;//累計所有和2相連的節點int ans=0,s3=n-s1-s2-2,now1=s1,now2=s2;//now分別表示當前我們還有處理的與1和2相連的節點個數for (int i=3;i<=n;i++){if (link[i]==1){//如果當前節點和1相連now1--,ans+=now1;//表示當前這個節點和其他和for (int e=H[i];e;e=E[e].nt){int v=E[e].to;if (link[v]&&v>i) ans--;//減掉重復的邊}}if (link[i]==2){now2--,ans+=now2;for (int e=H[i];e;e=E[e].nt){int v=E[e].to;if (link[v]&&v>i) ans--;//減掉重復的邊}}if (!link[i]){s3--; ans+=s3;int fg=0,s=0;for (int e=H[i];e;e=E[e].nt){int v=E[e].to;if (link[v]) fg=link[v],s++;else if (v>i) ans--;}if (fg==1) ans+=s1-s;else if (fg==2) ans+=s2-s;else ans+=max(s1,s2);}}printf("%d\n",ans);return 0; }

轉載于:https://www.cnblogs.com/chhokmah/p/10465905.html

總結

以上是生活随笔為你收集整理的[luogu3505][bzoj2088][POI2010]TEL-Teleportation【分层图】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。