題目
發現題目給了一張補圖,求的是最大團
而且隱隱約約告訴我們這張補圖是乙個二分圖
於是非常自然聯想到最大團等於補圖最大獨立集
最大獨立集又等於總點數-最小點覆蓋
最小點覆蓋=最大匹配
使得最大團增加就需要使得最大匹配減小
於是我們終於讀懂題目了,就是求二分圖匹配的必須邊
直接在殘量網路裡跑\(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維護 有乙個結論 圖上任意乙個環都可以用若干個生成樹上一條路...