HDU 5277 YJC counts stars (二维平面图求最大团)

题目链接:传送门

题意:

感觉这次读题特别重要啊“这些点满足任意三点不共线。他把一些点用线段连起来了,但是任意两条线段不会在端点以外相交”这是题目给的原话,但是比赛的时候一直没有用。。。然后就SB了,因为平面图两两相连而且不相交的点集最大就为4,那么就可以分别来考虑了。

首先考虑最大为4的情况,分别枚举两条边,如果这两条边没有公共点,而且顶点两两相连那么就是一个符合的。

如果最大为3的话,那么就可以枚举一条边,然后再枚举点就可以了。

如果最大为2,就输出边数。最大为1的话就输出点的个数。

代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <set>
using namespace std;

const int maxn = 1010;

int head[maxn];

struct nod{
    int u,v;
}edge[maxn*maxn];

bool mp[maxn][maxn];

int main(){
    int n,m;
    while(~scanf("%d%d",&n,&m)){
        int x,y;
        for(int i=0;i<n;i++) scanf("%d%d",&x,&y);
        memset(mp,0,sizeof(mp));
        for(int i=0;i<m;i++){
            scanf("%d%d",&x,&y);
            edge[i].u=x;
            edge[i].v=y;
            mp[x][y]=1,mp[y][x]=1;
        }
        if(m==0){
            printf("1 %d\n",n);
            continue;
        }
        int sum=0;
        for(int i=0;i<m;i++){
            int u=edge[i].u,v=edge[i].v;
            for(int j=i+1;j<m;j++){
                int u1=edge[j].u,v1=edge[j].v;
                if(u1==u||v1==v||u1==v||v1==u) continue;
                if(mp[u1][v]&&mp[v1][u]&&mp[u][u1]&&mp[v][v1]) sum++;
            }
        }
        if(sum){
            printf("4 %d\n",sum/3);
            continue;
        }
        for(int i=0;i<m;i++){
            int u=edge[i].u,v=edge[i].v;
            for(int j= 1;j<=n;j++){
                if(j==v||j==u) continue;
                if(mp[u][j]&&mp[v][j]) sum++;
            }
        }
        if(sum){
            printf("3 %d\n",sum/3);
            continue;
        }
        else
            printf("2 %d\n",m);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 17:34:56

HDU 5277 YJC counts stars (二维平面图求最大团)的相关文章

hdu 5277 YJC counts stars

hdu 5277 YJC counts stars 题意: 给出一个平面图,n个点,m条边,直线边与直线边之间不相交,求最大团的数目. 限制: 1 <= n <= 1000 思路: 因为平面图,直线边与直线边之间不相交,所以最大团的大小最大为4,m<=3*n-6. 所以对于答案4,枚举两条边. 对于答案3,枚举一条边一个点. /*hdu 5277 题意: 给出一个平面图,n个点,m条边.直线边与直线边之间不相交,求最大团的数目. 限制: 1 <= n <= 1000 思路:

hdu 5277 YJC counts stars 暴力

YJC counts stars Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5277 Description YJC是个老火车小司机.一个晚上,他仰望天空,星辰璀璨,他突然觉得,天空就像一个平面,而每一个星辰,就是平面中的一个点.他把这些点编号为1到n.这些点满足任意三点不共线.他把一些点用线段连起来了,但是任意两条线段不会在端点以外相交.如果一个点的集合中任意两个

HDU5277 YJC counts stars (图论知识平面图)

题意:给定一个平面图求最大团的个数和最大团内的顶点数 数据范围:数据组数T<=5  顶点数<=1000 边数没有给 思路:这是bc的一道题,中文题面语句太随便了,没看明白,看了英文后才看懂原来是一个平面图 定义:一个图G,若可以将它画在平面上,使它的边仅在顶点上才能相交,则称图G为可平面图 在纸上画画便可知最大团的最大为4,而且每添一个顶点极大平面图的边数只能增加3,而且的确有这个公式:m<=3*n-6 而且答案为4的最大团都是一种形状,枚举两条边,两边无公共点而且两端点互相连通即符合,

HDU 4901 The Romantic Hero(二维dp)

题目大意:给你n个数字,然后分成两份,前边的一份里面的元素进行异或,后面的一份里面的元素进行与.分的时候按照给的先后数序取数,后面的里面的所有的元素的下标一定比前面的大.问你有多上种放元素的方法可以使得前面异或的值和后面与的值相等. dp[x][y] 表示走到第x步,得到y这个数字一共有多少种方法. 但是需要注意这里得分一下,不能直接用dp数组存种数,你需要分一下从上一层过来的次数,和这一层自己可以到达的次数.然后取和的时候前后两个集合的种数进行乘法,注意边乘边取余. 顺便给一组数据: 4 3

hdu 2795 线段树(二维问题一维化)

Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10961    Accepted Submission(s): 4863 Problem Description At the entrance to the university, there is a huge rectangular billboard of s

HDU 1823 Luck and Love 二维线段树

Problem Description 世界上上最远的距离不是相隔天涯海角 而是我在你面前 可你却不知道我爱你 ―― 张小娴 前段日子,枫冰叶子给Wiskey做了个征婚启事,聘礼达到500万哦,天哪,可是天文数字了啊,不知多少MM蜂拥而至,顿时万人空巷,连扫地的大妈都来凑热闹来了.―_―||| 由于人数太多,Wiskey实在忙不过来,就把统计的事情全交给了枫冰叶子,自己跑回家休息去了.这可够枫冰叶子忙的了,他要处理的有两类事情,一是得接受MM的报名,二是要帮Wiskey查找符合要求的MM中缘分最

hdu 2660 Accepted Necklace (二维背包)

Accepted Necklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2530    Accepted Submission(s): 999 Problem Description I have N precious stones, and plan to use K of them to make a necklace f

二维数组求子数组之和最大值(首尾相接, 圆柱)

问题:求二维数组的子数组之和的最大值(首尾相接,即形成圆柱) 成员: 陈晨:负责代码复审和代码测试计划 王颖瑞:负责程序分析,代码编程 思路:对于这个问题,我们可以结合之前的实验(二维数组求子数组之和的最大值和首尾相连一维数组的子数组之和的最大值),把为二维数组的列扩大二倍,之后想一维数组(首尾相连)一样,把二维数组分成不同的几个二维数组.之后就分开求不同的二维数组的子数组的最大值,最后之间比较,求出总的最大值. 代码: #include<iostream> using namespace s

hdu 5677 ztr loves substring 二维费用背包+回文

题目链接: hdu 5677 ztr loves substring 官方题解: //这部分是错的(首先,对于每一个串i跑一次manancher,令g[i][j]=p[j]-1g[i][j]=p[j]−1 这样,g就存储了所有的回文子串的长度 为了方便,把g降到一维表示) 首先,因为字符串长度较小,所以直接二重for循环找就好了,用一个数组 g记录各个回文串的长度 不妨把每一个子串抽象成一个物品 费用为二维的,即{长度,1} 价值是Bool型的 这样就成了一个二维判断可行性费用背包问题 设f(i