[二分答案+判断二分图]40ptsWA求助
查看原帖
[二分答案+判断二分图]40ptsWA求助
941560
HeiCat0725楼主2024/10/24 16:53

思路大概是二分答案然后check函数里对每个情况建图,之后dfs搜查有没有奇环。初步怀疑是dfs函数写错,但找不出来。

评测记录,(点1已过)

对于第二组数据(数据太大不方便展示)输出 31191而非31065

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double lb;

const int N=2e4+5,M=1e5+5;
int n,m;
struct node{
	int u,v,num;
}arr[M];
bool cmp(node a,node b){
	if(a.num<b.num) return 1;
	else return 0;
}
vector<int> vt[N];bool vis[N];
bool dfs(int i,int num,int fa){
	bool flag=1;
	if((int)vt[i].size()==0){
		vis[i]=1;
		return 1;
	}
	vis[i]=1;
	for(auto u:vt[i]){
		if(u==fa) continue;
		if(vis[u]){
			if((num+1)%2==1) return 0;
		}else{
			flag=dfs(u,num+1,i);
			if(!flag) return 0;
		}
	}
	return 1;
}
bool check(int mid){
	for(int i=1;i<=n;i++) vt[i].clear(),vis[i]=0;
	for(int i=mid+1;i<=m;i++){
		int u=arr[i].u,v=arr[i].v;
		vt[u].push_back(v);
		vt[v].push_back(u);
	}
	int f=1;
	for(int i=1;i<=n;i++){
		if(!vis[i]) f=dfs(i,0,i);
		if(!f) break;
	}
	if(!f) return 0;
	else return 1;
}

int ans;
int main(){
   	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&arr[i].u,&arr[i].v,&arr[i].num);
	}
	sort(arr+1,arr+m+1,cmp);
	int l=0,r=m;
	while(l<=r){
		int mid=(l+r)>>1;
		if(check(mid)){
			r=mid-1;
			ans=mid;
		}else l=mid+1;
	}
	printf("%d",arr[ans].num);
	return 0;
}
/*
*/

2024/10/24 16:53
加载中...