• 沈阳网络赛F-Fantastic Graph【贪心】or【网络流】


    "Oh, There is a bipartite graph.""Make it Fantastic."

    X wants to check whether a bipartite graph is a fantastic graph. He has two fantastic numbers, and he wants to let all the degrees to between the two boundaries. You can pick up several edges from the current graph and try to make the degrees of every point to between the two boundaries. If you pick one edge, the degrees of two end points will both increase by one. Can you help X to check whether it is possible to fix the graph?

    Input

    There are at most 3030 test cases.

    For each test case,The first line contains three integers NN the number of left part graph vertices, MM the number of right part graph vertices, and KK the number of edges ( 1 le N le 20001≤N≤2000,0 le M le 20000≤M≤2000,0 le K le 60000≤K≤6000 ). Vertices are numbered from 11to NN.

    The second line contains two numbers L, RL,R (0 le L le R le 300)(0≤L≤R≤300). The two fantastic numbers.

    Then KK lines follows, each line containing two numbers UU, VV (1 le U le N,1 le V le M)(1≤U≤N,1≤V≤M). It shows that there is a directed edge from UU-th spot to VV-th spot.

    Note. There may be multiple edges between two vertices.

    Output

    One line containing a sentence. Begin with the case number. If it is possible to pick some edges to make the graph fantastic, output "Yes"(without quote), else output "No" (without quote).

    样例输入复制

    3 3 7
    2 3
    1 2
    2 3
    1 3
    3 2
    3 3
    2 1
    2 1
    3 3 7
    3 4
    1 2
    2 3
    1 3
    3 2
    3 3
    2 1
    2 1

    样例输出复制

    Case 1: Yes
    Case 2: No

    题目来源

    ACM-ICPC 2018 沈阳赛区网络预赛

    题意:

    有一个二分图 每个节点的初始分数为0

    每选一条边 边的端点的分数都加1

    问如果要求最后所有端点的分数都在l和r之间 可不可以做到

    思路:

    比赛的时候凌晓突然说这个是上下限网络流的模板题

    于是一大帮人就想着怎么改模板 一直到比赛结束都没有改出来

    真的没想到居然可以贪心 还好名额拿到了......

    很简单的策略:

    相当于删除一些边 使得节点的度数在l和r之间 最后剩下的边就是选择的边

    枚举每条边 如果u, v的度都大于R 那么这条边肯定可以删掉

    如果u的度大于R, v的度小于R却大于L 那么这条边也可以删掉

    同理 uv交换也是

    如果本来uv的度就在LR之间 就不用管了

    最后检查每一个节点的度是不是在LR之间 结束

    贪心AC:

    
    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<stack>
    #include<queue>
    #include<map>
    #include<vector>
    #include<cmath>
    #include<cstring>
    #include<set>
    //#include<bits/stdc++.h>
    #define inf 0x7f7f7f7f7f7f7f7f
    using namespace std;
    typedef long long LL;
    
    const int maxk = 6005;
    const int maxn = 4005;
    int n, m, k, l, r;
    struct edge {
    	int u, v;
    }e[maxk];
    int degree[maxn];
    
    void init()
    {
    	memset(degree, 0, sizeof(degree));
    }
    
    int main()
    {
    	int cas = 1;
    	while (scanf("%d%d%d", &n, &m, &k) != EOF) {
            init();
    		scanf("%d%d", &l, &r);
    		for (int i = 0; i < k; i++) {
    			scanf("%d%d", &e[i].u, &e[i].v);
    			e[i].v += n;
    			degree[e[i].u]++;
    			degree[e[i].v]++;
    		}
    
    		for (int i = 0; i < k; i++) {
    			int a = e[i].u, b = e[i].v;
    			if (degree[a] > r && degree[b] > r) {
    				degree[a]--;
    				degree[b]--;
    			}
    			else if (degree[a] > l || degree[b] > l) {
    				degree[a]--;
    				degree[b]--;
    			}
    		}
    
    		bool flag = true;
    		for (int i = 1; i <= n + m; i++) {
    			if (degree[i] > r || degree[i] < l) {
    				flag = false;
    				break;
    			}
    		}
    		if (flag) {
    			printf("Case %d: Yes
    ", cas++);
    		}
    		else {
    			printf("Case %d: No
    ", cas++);
    		}
    	}
    	return 0;
    }
    

    上下限网络流的算法正在学习中......

  • 相关阅读:
    二叉树遍历
    keras简单介绍与使用
    pandas基础使用
    如何在真机装linux(本人在台式机上又添了个硬盘)
    linux下安装kears
    Java Web 环境搭建步骤(超详细,包括前期安装步骤)
    python求范数
    随笔
    【opencv C++ linux】linux下编译含opencv的C++代码
    【论文阅读】DCAN: Deep Contour-Aware Networks for Accurate Gland Segmentation
  • 原文地址:https://www.cnblogs.com/wyboooo/p/9643360.html
Copyright © 2020-2023  润新知