zoukankan      html  css  js  c++  java
  • 257. 关押罪犯

    算法

    二分图+判定

    思路

    显然要让答案最小,应让怨气值较大的不在同一监狱。尽量让较小的在同一个监狱里矛盾。及分成两个集合。满足二分图。而后二分答案,以最后的怨气值为mid,凡大于mid的罪犯都需在不同集合,只需判定是否为二分图即可。

    核心

    二分图判定+染色法

    bool dfs(int x, int color) {
    	v[x] = color;
    	for (unsigned int i = 0; i < e[x].size(); i++) {
    		int y = e[x][i].first;
    		if (v[y]) {
    			if (v[y] == color) return 0;
    		} else {
    			if (!dfs(y, 3 - color)) return 0;
    		}
    	}
    	return 1;
    }
    

      

     二分

    while (l < r) {
    		int mid = (l + r) >> 1;
    		if (pd(mid)) r = mid;
    		else l = mid + 1;
    	}

    代码

    #include <cstdio>
    #include <vector>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int N = 20006, M = 200006;
    struct P {
    	int x, y, z;
    	bool operator < (const P w) const {
    		return z > w.z;
    	}
    } p[M];
    int n, m, v[N];
    vector<pair<int, int> > e[N];
    
    bool dfs(int x, int color) {
    	v[x] = color;
    	for (unsigned int i = 0; i < e[x].size(); i++) {
    		int y = e[x][i].first;
    		if (v[y]) {
    			if (v[y] == color) return 0;
    		} else {
    			if (!dfs(y, 3 - color)) return 0;
    		}
    	}
    	return 1;
    }
    
    inline bool pd(int now) {
    	for (int i = 1; i <= n; i++) e[i].clear();
    	for (int i = 1; i <= m; i++) {
    		if (p[i].z <= now) break;
    		e[p[i].x].push_back(make_pair(p[i].y, p[i].z));
    		e[p[i].y].push_back(make_pair(p[i].x, p[i].z));
    	}
    	memset(v, 0, sizeof(v));
    	for (int i = 1; i <= n; i++)
    		if (!v[i] && !dfs(i, 1)) return 0;
    	return 1;
    }
    
    int main() {
    	cin >> n >> m;
    	for (int i = 1; i <= m; i++)
    		scanf("%d %d %d", &p[i].x, &p[i].y, &p[i].z);
    	sort(p + 1, p + m + 1);
    	int l = 0, r = p[1].z;
    	while (l < r) {
    		int mid = (l + r) >> 1;
    		if (pd(mid)) r = mid;
    		else l = mid + 1;
    	}
    	cout << l << endl;
    	return 0;
    }
    

      

  • 相关阅读:
    docker容器跨服务器的迁移的方法
    Docker 更改镜像存储位置
    将Docker容器转移至另一服务器
    docker容器存放目录磁盘空间满了,转移数据修改Docker默认存储位置
    在线|二轮辅导[06][三角函数+解三角形02]
    在线|二轮辅导[05][三角函数+解三角形01]
    推荐|网络画板2D学习笔记
    推荐|网络画板3D学习笔记
    导数法求函数最值
    在线|二轮辅导[04][函数与导数02]
  • 原文地址:https://www.cnblogs.com/ruanmowen/p/12724163.html
Copyright © 2011-2022 走看看