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

题意:给定一个平面图求最大团的个数和最大团内的顶点数

数据范围:数据组数T<=5  顶点数<=1000 边数没有给

思路:这是bc的一道题,中文题面语句太随便了,没看明白,看了英文后才看懂原来是一个平面图

定义:一个图G,若可以将它画在平面上,使它的边仅在顶点上才能相交,则称图G为可平面图

在纸上画画便可知最大团的最大为4,而且每添一个顶点极大平面图的边数只能增加3,而且的确有这个公式:m<=3*n-6

而且答案为4的最大团都是一种形状,枚举两条边,两边无公共点而且两端点互相连通即符合,3n*3n的复杂度可行

然后再处理答案是3,2,1的情况

还有一种思路就是一步到位,枚举点数然后统计4,3,2,1为答案的个数有多少个,可以按点数从小到大遍历,这样不重复,

然后而且复杂度也不是On^4的因为只有m条边,官方题解给了证明是n^2的复杂度,实际跑起来也比较快

3 kalili 0MS 5584K 1942B C++ 2015-07-05 15:15:17

#include <iostream>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <sstream>
#include <string>
#include <vector>
#include <cstdio>
#include <ctime>
#include <bitset>
#include <algorithm>
#define SZ(x) ((int)(x).size())
#define ALL(v) (v).begin(), (v).end()
#define foreach(i, v) for (__typeof((v).begin()) i = (v).begin(); i != (v).end(); ++ i)
#define REP(i,n) for ( int i=1; i<=int(n); i++ )
using namespace std;
typedef long long ll;
const int N = 1005;

struct Edge
{
    int v,nxt;
    Edge() {}
    Edge(int v,int nxt) : v(v),nxt(nxt){}
}es[3*N];
int cnt;
int n,m;
int head[N];
void inline add_edge(int a,int b)
{
    int u = min(a,b),v = max(a,b);
    es[cnt] = Edge(v,head[u]);
    head[u] = cnt++;
}

int mp[N][N];
int c[5];
void ini()
{
    cnt=0;
    REP(i,n) REP(j,n) mp[i][j] = 0;
    REP(i,n) head[i] = -1;
    REP(i,4) c[i] = 0;
}
int sta[5];
inline bool no(int p,int u)
{
    REP(i,p)
        if(mp[sta[i]][u]==0) return true;
    return false;
}
void dfs(int p,int u)
{
    c[p]++;
    if(p == 4) return ;
    for(int i = head[u];~i;i=es[i].nxt)
    {
        int v = es[i].v;
        if(v < u || no(p,v)) continue;
        sta[p+1] = v;
        dfs(p+1,v);
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        ini();
        REP(i,n)
        {
            int a,b;
            scanf("%d%d",&a,&b);
        }
        REP(i,m)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            add_edge(u,v);
            mp[u][v] = mp[v][u] = 1;
        }
        REP(i,n)
        {
            sta[1] = i;
            dfs(1,i);
        }
        if(c[4]) printf("4 %d\n",c[4]);
        else if(c[3]) printf("3 %d\n",c[3]);
        else if(c[2]) printf("2 %d\n",c[2]);
        else if(c[1]) printf("1 %d\n",c[1]);
    }
}

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

时间: 2024-10-06 20:19:33

HDU5277 YJC counts stars (图论知识平面图)的相关文章

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

题目链接:传送门 题意: 感觉这次读题特别重要啊"这些点满足任意三点不共线.他把一些点用线段连起来了,但是任意两条线段不会在端点以外相交"这是题目给的原话,但是比赛的时候一直没有用...然后就SB了,因为平面图两两相连而且不相交的点集最大就为4,那么就可以分别来考虑了. 首先考虑最大为4的情况,分别枚举两条边,如果这两条边没有公共点,而且顶点两两相连那么就是一个符合的. 如果最大为3的话,那么就可以枚举一条边,然后再枚举点就可以了. 如果最大为2,就输出边数.最大为1的话就输出点的个数

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.这些点满足任意三点不共线.他把一些点用线段连起来了,但是任意两条线段不会在端点以外相交.如果一个点的集合中任意两个

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 思路:

图论知识整理(2) 拓扑排序、最短路、最小生成树

===================================== 发现以前图论学的很不好,什么都不会,现在开始整理图论知识了 作者就是个蒟蒻,ORZ各位大神们 ===================================== 定义:对一个有向无环图(Directed Acyclic Graph,简称DAG)进行拓扑排序,将图中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前. 说的好像很有道理,然而我并没有看懂它在

图论知识错题本

1.判断出一个有向图是否有环的是:a.最短路径有向图最短路径Dijkstra不一定能够判断有环,除非Visted数字记录0(false),1(已经访问),     2(再一次重复访问): b.括扑排序:通过入度0之后记录顶点数与原Vetex相比较 C.DFS(深度优先遍历),图处理成树结构时候,找到一个节点保存节点,DFS找到重复节点表面图中有环 D.但是BFS(广度优先遍历),层次遍历方式,A->C,B->C,图中两条边指向一个公共点C,nodeC访问重复,但是不能判断其中出现环情况 2.有

图论知识记录

二分图相关 二分图,两个等价定义:没有奇环的图 / 可以黑白染色的图 证明: 充分性证明:如果一张图没有奇环,那么它可以黑白染色 考虑反证,如果它不能黑白染色,那么存在奇环 一定存在一条边\((u, v)\),使得\(u, v\)同时为白色 \((u, v)\)一定在环中,如果不在,考虑\(dfs\)构造,那么\((u, v)\)不可能是同一颜色 如果\((u, v)\)所在环是一个偶环,那么取反\(u\)后,原图合法,不符合无法染色的条件 因此,\((u, v)\)所在环一定是一个奇环 必要性

图论基础知识.

今天先写一些基础的图论知识: 1.floyed算法: 2.spfa算法: 3.dijkstra(迪杰斯特拉)算法:(先不写) 1.floyed算法 可以找到任意两点之间的最短路,即dis[i][j]: 原理:图的传递闭包思想:时间复杂度:O(n*n*n); 思想也比较好理解(三角形任意两边之和大于第三边嘛,如果出现不符合,就更新距离,这样比较好想) 例题oj1212图G是一个无向连通图,没有自环,并且两点之间至多只有一条边.我们定义顶点v,u最短路径就是从v到u经过边最少的路径.所有包含在v-u

图论及其应用——图

我们探索某个领域的知识,无不怀揣的核弹级的好奇心与求知欲,那么,今天,我们就将开始对图论的探索.   观察一副<机械迷城> 的一处谜题.    不得不承认,<机械迷城>这款解密游戏难度远胜于<纪念碑谷>, 其中一个困难点就在于——<纪念碑谷>的目标是很明确的,但是<机械迷城>往往需要自己凭感觉设立目标.而这里的关卡的目标,就是堵住第三个出水口. 为了解决这个谜题,如果不去考虑用暴力枚举的方法去试探(其实很多情况下都是用到这种情况)一开始,我们似乎

图论4——探索网络流的足迹:Dinic算法

1. 网络流:定义与简析 1.1 网络流是什么? 网络流是一种"类比水流的解决问题方法,与线性规划密切相关"(语出百度百科). 其实,在信息学竞赛中,简单的网络流并不需要太高深的数学知识. 首先我们需要知道一些名词是什么意思: 点(\(node\)).就是一个节点.点集通常用\(V\)表示.其中,有一个源点\(s\)和一个汇点\(t\),所有的流都从源点\(s\)出发,经过一些边之后到达汇点\(t\). 边(\(edge\)).这个东西和大家在其他图论知识中所用到的差不多,用于连接两个