題目鏈結
這道題對於題意的轉化很關鍵。
題目要求的是添上一條邊,使得圖中最大團的大小變大。給出的邊是原圖的補集,這就給我們了提示。
因為題目中說,原圖中最多有兩個團。所以給出的邊一定形成了乙個二分圖。
那麼最大團就是新圖中的最大獨立集。
那麼問題就轉化成了,在新圖中刪除一條邊,使得新圖中的最大獨立集變大。
因為最大獨立集 = 點數-最大匹配。
所以我們要讓最大匹配變小。
考慮刪除哪些邊會讓最大匹配變小。首先肯定要在跑完網路流之後是滿流的。然後不能由其他的邊來代替。也就是說在殘餘網路上跑一遍\(tarjan\),滿足兩段不在同乙個強聯通分量中的邊。
所以做法也就出來了。先建圖跑一遍網路流,然後在殘餘網路上\(tarjan\)一遍。再遍歷所有邊,找出那些不在兩段不在同乙個強連通分量中,並且滿流的邊。
#include#include#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
#define change(x) x & 1 ? x + 1 : x - 1
const int m = 600010,n = 10010,inf = 1e9 + 7;
ll read()
while(c>='0'&&c<='9')
return x*f;
}struct node e[m << 1],e[m << 1],ans[m << 1];
int anss;
int head[n],ejs;
void add(int u,int v,int w)
void add(int u,int v)
int n,m,s,t;
int lb[n];
void con(int u)
}int dep[n],dfn[n],inque[n],sta[n],top,low[n],cnt,col[n],coljs;
void tarjan(int u)
if(low[u] == dfn[u]) }}
queueq;
int bfs()
} return 0;
}int dfs(int u,int now)
} return re;
}void dinic() }}
bool tmp(node x,node y)
int main()
for(int i = 1;i <= n;++i)
if(!lb[i]) lb[i] = 1,con(i);
memset(head,0,sizeof(head));
ejs = 0;
s = n + 1,t = s + 1;
for(int i = 1;i <= n;++i)
for(int i = 1;i <= m * 2;i += 2)
dinic();
for(int i = 1;i <= n;++i) if(!dfn[i]) tarjan(i);
for(int i = 1;i <= ejs;i += 2)
} printf("%d\n",anss);
sort(ans + 1,ans + anss + 1,tmp);
for(int i = 1;i <= anss;++i)
return 0;
}
lgP3731 HAOI2017 新型城市化
題意 有多少條,一定被包含在最大匹配裡面 sol.60分,斷掉每一條邊,看是否任然滿流,若不滿流,則必須出現在最大匹配裡面 考慮滿分做法 直接如果一條邊,在殘餘網路的乙個強連通分量裡面,是可以不選的 就做完了 include define maxn 10005 define maxm 200005 ...
codevs3731 luogu2296 尋找道路
在有向圖g 中,每條邊的長度均為1 現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件 1 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。2 在滿足條件1 的情況下使路徑最短。注意 圖g 中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度。輸入格式...
智慧型路燈點亮新型城市
大概很多人都有聽說過智慧型城市,但是也有很多人不會想到路燈,而它卻是智慧型城市中不可或缺的一部分。目前,全球越來越多的城市把路燈改造作為物聯網建設的節點,並相容多個行業的應用。例如,監測節約照明能源 尋找空閒車位 測量空氣質素 安防行業等。一 什麼是物聯網智慧型路燈 二 智慧型路燈 小身段,大功能 ...