HAOI2017 新型城市化

2022-03-27 02:32:38 字數 1462 閱讀 4578

題目

發現題目給了一張補圖,求的是最大團

而且隱隱約約告訴我們這張補圖是乙個二分圖

於是非常自然聯想到最大團等於補圖最大獨立集

最大獨立集又等於總點數-最小點覆蓋

最小點覆蓋=最大匹配

使得最大團增加就需要使得最大匹配減小

於是我們終於讀懂題目了,就是求二分圖匹配的必須邊

直接在殘量網路裡跑\(tarjan\),就是如果這條邊沒有滿流就連上

對於一條邊\((x,y)\)

如果\((x,y)\)是一條匹配邊或者\(x\),\(y\)在同乙個強聯通分量裡,那麼這就是一條最大匹配的可行邊

如果\((x,y)\)是一條匹配邊並且\(x\),\(y\)不在同乙個強連通分量裡,那麼這就是一條必須邊

**

#include#include#include#include#include#include#define re register

#define mp std::make_pair

#define ll long long

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)<(b)?(a):(b))

const int maxn=12005;

const int inf=1e9;

inline int read()

struct ee[500005];

int n,m,num=1,s,t;

std::queueq;

int head[maxn],d[maxn],cur[maxn],co[maxn];

inline void c(int x,int y,int f)

inline void add(int x,int y,int f)

inline int bfs()

return d[t];

}int dfs(int x,int now)

return flow;

}std::vectoree[maxn];

namespace tarjan

if(dfn[x]==low[x]) while(mid!=x);

} }void solve()

} std::sort(ans+1,ans+tot+1);

printf("%d\n",tot);

for(re int i=1;i<=tot;i++) printf("%d %d\n",ans[i].first,ans[i].second); }}

void paint(int x,int c)

}int main()

while(bfs()) dfs(s,inf);

tarjan::solve();

return 0;

}

lgP3731 HAOI2017 新型城市化

題意 有多少條,一定被包含在最大匹配裡面 sol.60分,斷掉每一條邊,看是否任然滿流,若不滿流,則必須出現在最大匹配裡面 考慮滿分做法 直接如果一條邊,在殘餘網路的乙個強連通分量裡面,是可以不選的 就做完了 include define maxn 10005 define maxm 200005 ...

luogu3731 新型城市化

題目鏈結 這道題對於題意的轉化很關鍵。題目要求的是添上一條邊,使得圖中最大團的大小變大。給出的邊是原圖的補集,這就給我們了提示。因為題目中說,原圖中最多有兩個團。所以給出的邊一定形成了乙個二分圖。那麼最大團就是新圖中的最大獨立集。那麼問題就轉化成了,在新圖中刪除一條邊,使得新圖中的最大獨立集變大。因...

HAOI2017 八縱八橫

題目傳送門 分析 乙個熟練的oi選手 錯亂 會發現詢問其實就是在圖上找一些環使得異或和最大 感性分析 鏈結這些環的路徑會因為被經過了偶數次而異或起來被抵消掉 考慮求圖上的一顆生成樹,因為原圖上的高速路不會被取消,圖一定連通 否則可以用lct維護 有乙個結論 圖上任意乙個環都可以用若干個生成樹上一條路...