比赛 防止颓废的小练习v0.2 评测结果 AAAAAAAAAA
题目名称 关押罪犯 最终得分 100
用户昵称 农场主 运行时间 0.156 s
代码语言 C++ 内存使用 0.62 MiB
提交时间 2016-10-18 21:31:38
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring> 
#define maxn 20001
using namespace std;
class edge{
public:
	int from,to,dis;
	/*bool operator < (const edge e)const{
		return dis>e.dis;
	}*/
};
vector<edge> edges;
vector<int> G[maxn];
int d[maxn]={0},n,m;
//bool vis[maxn]={0};
void init(int n){
	for(int i=0;i<=n;i++){
		G[i].clear();
		d[i]=-1;
//		printf("%d",i);
	}
//	memset(vis,0,sizeof(vis));
}
void make_map(int x){
	init(n);
	for (int i=0;i<edges.size();i++){
		edge e=edges[i];
		if (e.dis<=x) continue;
		G[e.from].push_back(e.to);
		G[e.to].push_back(e.from);
//		printf("%d %d\n",e.from,e.to);
	}
}
bool dfs(int x,int t,int fa){
//	printf("%d\n",x);
	if (d[x]!=-1&&d[x]!=t) return 0;
	if (d[x]==t) return 1;
	d[x]=t;
	for (int i=0;i<G[x].size();i++){
		if (G[x][i]==fa) continue;
		if (!dfs(G[x][i],t^1,x)) return 0;
	}
	return 1;
}
bool check(int x){
	make_map(x);
	for (int i=1;i<=n;i++){
		if (d[i]==-1){
//			printf("a");
			if (!dfs(i,0,0)) return 0;
		}
	}
	return 1;
}
int lower_bound(){
	int l=0,r=1000000000,mid;
	while(l<r){
		mid=(l+r>>1);
		if (check(mid)){
			r=mid;
		}
		else l=mid+1;
	}
	return l;
}
void read(){
	scanf("%d%d",&n,&m);
	for (int i=1;i<=m;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		edges.push_back((edge){u,v,w});
	}
//	sort(edges.begin(),edges.end());
	int ans=lower_bound();
	printf("%d",ans);
}
int main(){
	freopen("prison1.in","r",stdin);
	freopen("prison1.out","w",stdout);
	read();
}