(我都不知道有什么用)
二分图
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct edge{
int v,w,next;
}Edge[100005];
int n,m,col[20005],data[100005];
int head[20005],cnt;
int l,r,mid,Max;
bool book[20005];
inline void AddEdge(int u,int v,int w){//邻接链表存边
cnt++;
Edge[cnt].v=v;
Edge[cnt].w=w;
Edge[cnt].next=head[u];
head[u]=cnt;
return;
}
bool dfs(int u,int color){//基本上二分图染色都可以参照这个模板
if (book[u]) return col[u]==color;
book[u]=true;
col[u]=color;
bool flag=true;
for (int i=head[u];i!=0&&flag;i=Edge[i].next){
int v=Edge[i].v;
if (Edge[i].w<=Max) continue;//如果比枚举的最大边Max小,可以不用管它,即把它暂时
flag=dfs(v,1-color);//放在原来的联通块中
}
return flag;
}
inline bool Colored(){
memset(book,false,sizeof (book));//不要忘了初始化
memset(col,0,sizeof (col));
Max=data[mid];
for (int i=1;i<=n;i++){
if (book[i]) continue;
if (!dfs(i,0)) return false;
}
return true;
}
int main(){
int u,v,w;
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
data[i]=w;
AddEdge(u,v,w);
AddEdge(v,u,w);
}
sort (data+1,data+m+1);
l=0;
r=m;
while (l<r){
mid=(l+r)>>1;
if (Colored()) r=mid;
else l=mid+1;
}
printf ("%d\n",data[l]);
return 0;
}
二分图匹配(其实我没看懂)
匈牙利算法:
本文作者:Snowflake_Pink
本文链接:https://snowflake.pink/archives/26/
最后修改时间:2020-04-13 11:15:01
本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!