constint N=2e4+10,M=2e5+10; int h[N],e[M],ne[M],idx,w[M]; int color[N],now,n,m; bool res; voidadd(int a,int b,int c) { e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++; }
voiddfs(int x) { if (!res) return; for (int i=h[x];~i;i=ne[i]) if (w[i]>now) { if (color[x]==color[e[i]]) { res=0; return; } if (color[e[i]]==0) { color[e[i]]=-color[x]; dfs(e[i]); } } }
boolcheck(int mid) { memset(color,0,sizeof color); res=1;now=mid; for (int i=1;i<=n;++i) if (color[i]==0) color[i]=1,dfs(i); return res; }
intmain() { memset(h,-1,sizeof h); cin>>n>>m;int a,b,c; while (m--) { scanf("%d %d %d",&a,&b,&c); add(a,b,c);add(b,a,c); } int l=0,r=(int)1e9; while (l<r) { int mid=l+r>>1; if (check(mid)) r=mid; else l=mid+1; } cout<<l<<endl; return0; }
booldfs(int x)//是看 x 能不能重新匹配一个,能就返回 true { for (int i=h[x];~i;i=ne[i]) if (!vis[e[i]])//vis 在每一次重新 a 开始的时候都要清空,是为了看一下有没有又走回来,就导致死循环了 { vis[e[i]]=1; if (mat[e[i]]==0||dfs(mat[e[i]])) { mat[e[i]]=x; returntrue; } } returnfalse; }
#include<iostream>//AcWing 代码,Luogu n = m #include<cstring> #include<algorithm> #include<cstdio> #define PII pair<int,int> usingnamespace std;
constint N=110; PII mat[N][N]; int n,m; bool v[N][N],vis[N][N]; int dx[]={2,2,1,1,-1,-1,-2,-2}, dy[]={1,-1,2,-2,2,-2,1,-1};
boolcheck(int x,int y) { if (x>=1&&y>=1) return x<=n&&y<=m; returnfalse; }
booldfs(int x,int y) { if (v[x][y]) returnfalse; for (int k=0;k<8;++k) { int i=x+dx[k],j=y+dy[k]; if ((!check(i,j))||v[i][j]||vis[i][j]) continue; vis[i][j]=1; int ii=mat[i][j].first,jj=mat[i][j].second; if (((ii==0)&&(jj==0))||dfs(ii,jj)) { mat[i][j]=make_pair(x,y); // printf("%d %d:%d %d\n",x,y,i,j); returntrue; } } returnfalse; }
intmain() { int k,a,b; cin>>n>>m>>k;int tmp=k; while (k--) { scanf("%d %d",&a,&b); v[a][b]=1; } int res=0; for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) { if (v[i][j]||(i+j)&1) continue; memset(vis,0,sizeof vis); if (dfs(i,j)) res++; } cout<<n*m-tmp-res<<endl; return0; }