2 条题解
-
1Sankano (San001) LV 9 @ 2022-08-09 16:06:26
这道题有两种做法,这里的题解只有扩展域的并查集做法。
我推荐用二分的方法确定最大暴动事件的影响值,然后染色法判断大于这个值的时间(边)能否构成二分图。
AC code
#include <iostream> #include <cstring> using namespace std; const int N=2e5+10; int h[N],e[N],ne[N],w[N],idx=0; void add(int a,int b,int c) { e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++; e[idx]=a,w[idx]=c,ne[idx]=h[b],h[b]=idx++; } int n,m; //染色法判定二分图 int c[N]; bool dfs(int u,int color,int limit) { c[u]=color; for(int i=h[u];~i;i=ne[i]) { if(w[i]<=limit) continue; int j=e[i]; if(!c[j]&&!dfs(j,3-color,limit)) return false; else if(c[j]==color) return false; } return true; } bool check(int wall) { memset(c,0,sizeof c); for(int i=1;i<=n;i++) if(!c[i]&&!dfs(i,1,wall)) return false; return true; } int main() { memset(h,-1,sizeof h); cin>>n>>m; while(m--) { int a,b,c; cin>>a>>b>>c; add(a,b,c); } //二分法确定最大暴动事件的数 int l=0,r=1e9; while(l<r) { int mid=(l+r)/2; if(check(mid)) r=mid; else l=mid+1; } cout<<r; return 0; }
-
12019-06-06 15:51:41@
- 1