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
  思路:
  因为平面图。直线边与直线边之间不相交,所以最大团的大小最大为4,m<=3*n-6。
  所以对于答案4,枚举两条边;
  对于答案3,枚举一条边一个点;
 */
#include<iostream>
#include<cstdio>
#include<set>
#include<cstring>
#include<algorithm>
using namespace std;
#define MP make_pair
const int N=5000;
int fr[N],to[N];
int _set[N/4][N/4];
bool in(int f,int t){
	if(f==t) return false;
	if(f>t) swap(f,t);
	return _set[f][t]!=0;
}
bool ok(int i,int j){
	if(in(fr[i],fr[j]) && in(fr[i],to[j]) && in(to[i],fr[j]) && in(to[i],to[j])) return true;
	return false;
}

bool vis[9000010];
int get_id1(int i,int j){
	int a[4];
	a[0]=fr[i];
	a[1]=to[i];
	a[2]=fr[j];
	a[3]=to[j];
	sort(a,a+4);
	return _set[a[0]][a[1]]*3000+_set[a[2]][a[3]];
}
int four(int m){
	memset(vis,0,sizeof(vis));
	int cnt=0;
	for(int i=0;i<m;++i){
		for(int j=i+1;j<m;++j){
			if(ok(i,j)){
				int id=get_id1(i,j);
				if(vis[id]) continue;
				++cnt;
				vis[id]=1;
			}
		}
	}
	return cnt;
}
int get_id(int a,int b,int c){
	if(a>b) swap(a,b);
	if(b>c) swap(b,c);
	int ret=_set[a][b];
	ret=ret*1000+c;
	return ret;
}
int three(int n,int m){
	memset(vis,0,sizeof(vis));
	int cnt=0;
	for(int i=1;i<=n;++i){
		for(int j=0;j<m;++j){
			if(fr[j]==i || to[j]==i) continue;
			//cout<<fr[j]<<‘ ‘<<i<<endl;
			//cout<<to[j]<<‘ ‘<<i<<endl;
			if(in(i,fr[j]) && in(i,to[j])){
				int id=get_id(i,fr[j],to[j]);
				//cout<<id<<endl;
				if(vis[id]) continue;
				++cnt;
				vis[id]=1;
			}
		}
	}
	return cnt;
}
void gao(int n,int m){
	int ans=4;
	int cnt;
	cnt=four(m);
	if(cnt){ printf("%d %d\n",ans,cnt); return ;}
	--ans;
	cnt=three(n,m);
	//cout<<cnt<<endl;
	if(cnt){ printf("%d %d\n",ans,cnt); return ;}
	--ans;
	cnt=m;
	//cout<<cnt<<endl;
	if(cnt){ printf("%d %d\n",ans,cnt); return ;}
	printf("%d %d\n",1,n);
}
int main(){
	int n,m;
	int x,y;
	while(scanf("%d%d",&n,&m)!=EOF){
		memset(_set,0,sizeof(_set));
		for(int i=0;i<n;++i){
			scanf("%d%d",&x,&y);
		}
		for(int i=0;i<m;++i){
			scanf("%d%d",&fr[i],&to[i]);
			if(fr[i]>to[i]) swap(fr[i],to[i]);
			_set[fr[i]][to[i]]=i+1;
		}
		gao(n,m);
	}
	return 0;
}
时间: 2024-11-03 21:44:14

hdu 5277 YJC counts stars的相关文章

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 (二维平面图求最大团)

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

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

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

hdu 1541/poj 2352:Stars(树状数组,经典题)

Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4052    Accepted Submission(s): 1592 Problem Description Astronomers often examine star maps where stars are represented by points on a plan

hdu 5278 YJC plays automaton

YJC plays automaton Accepts: 1 Submissions: 14 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 524288/262144 K (Java/Others) 问题描述 YJC是个小火车老司机,所以他是袜子坊烧饼栏目举办的"吃的更圆"竞赛金牌获得者,他去吃特色菜时看到一个n+1个状态的自动机,编号为0到n,其中0号点表示NULL,他非常好奇于是开始了研究: 他选取了一个初始状态集合S,

hdu 5276 YJC tricks time 数学

YJC tricks time Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5276 Description YJC收到了一份神秘礼物.是一个长成这样的钟. YJC不是时间领主所以他并不能乱搞时间,但是这个钟实在是太难认了!所以他想来耍耍你. 现在YJC给你时针和分针间的夹角,让你告诉他现在是什么时候. 你将以以下格式给出可能的时间:HH:MM:SS分别表示小时,分钟

hdu 5279 YJC plays Minecraft——生成函数

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5279 令 n 个点的树的 EGF 是 g(x) ,则 \( g(x) = \sum\limits_{i=0}^{\infty} \frac{i^{i-2}}{i!} x^i \) 令 n 个点的森林的 EGF 是 f(x) ,则 \( f(x) = \sum\limits_{i=0}^{\infty} \frac{g(x)^i}{i!} = e^{g(x)} \) 这道题里,每个团调用 f(x) 的对应

HDU 5279 YJC plays Minecraft (分治NTT优化DP)

题目传送门 题目大意:有$n$个小岛,每个小岛上有$a_{i}$个城市,同一个小岛上的城市互相连接形成一个完全图,第$i$个小岛的第$a_{i}$个城市和第$i+1$个小岛的第$1$个城市连接,特别地,第$n$个小岛的第$a_{n}$个城市和第$1$个小岛的第$1$个城市连接.现在要断掉图中的一些边,保证任意两个城市只有一条路径或者不连通,求合法的断边方案总数,$n,a_{i}<=1e5$ 完全不会(喷血 我们对每个小岛单独讨论 如果任意两个城市只有一条路径或者不连通,那么这张图只能是一个森林

@hdu - [email&#160;protected] Counting Stars

目录 @[email protected] @[email protected] @accepted [email protected] @[email protected] @[email protected] 给定一个 n 点 m 边的无向图(无重边自环),求有多少子图形如,包含 4 个点 {A, B, C, D} 与 6 条边 {AB, BC, CD, DA, AC}. 原题链接. @[email protected] 一个并不常用的黑科技:三元环计数. mark一下博客地址. 注意到题目