`
Coco_young
  • 浏览: 125524 次
  • 性别: Icon_minigender_1
  • 来自: 湖南长沙
社区版块
存档分类
最新评论

[贪心]poj 1659 Frogs' Neighborhood

 
阅读更多

Frogs' Neighborhood

Time Limit : 10000/5000ms (Java/Other)Memory Limit : 20000/10000K (Java/Other)
Total Submission(s) : 5Accepted Submission(s) : 1
Special Judge
Problem Description

未名湖附近共有N个大小湖泊L1, L2, ..., Ln(其中包括未名湖),每个湖泊Li里住着一只青蛙Fi(1 ≤iN)。如果湖泊LiLj之间有水路相连,则青蛙FiFj互称为邻居。现在已知每只青蛙的邻居数目x1,x2, ...,xn,请你给出每两个湖泊之间的相连关系。


Input

第一行是测试数据的组数T(0 ≤ T ≤ 20)。每组数据包括两行,第一行是整数N(2 < N < 10),第二行是N个整数,x1,x2,...,xn(0 ≤xiN)。


Output

对输入的每组测试数据,如果不存在可能的相连关系,输出"NO"。否则输出"YES",并用N×N的矩阵表示湖泊间的相邻关系,即如果湖泊i与湖泊j之间有水路相连,则第i行的第j个数字为1,否则为0。每两个数字之间输出一个空格。如果存在多种可能,只需给出一种符合条件的情形。相邻两组测试数据之间输出一个空行。

题目要求,给定N个点的度数,构造一个无向图,如果能构造出来,输出YES并且输出该图的邻接矩阵,否则输出NO.
解法: 只需要把所有的节点的可以接的边数降为0即可,如果不能达到这个要求,说明无法构成一个无向图,至于怎么去降节点的可以接的边数,每次都需要对保存节点可以接的边数的数组进行排序(降序),拿出可以接的边数最大的节点,按可以接的边数的降序从剩余的节点中拿节点和它匹配,匹配的条件是这两个节点之间没有边,而且可以接的边数要大于0. 重复上述操作N次即可.
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 20;
int g[MAXN][MAXN],vis[MAXN][MAXN];
struct node
{
	int deg;
	int id;
	bool vis;
	bool operator < (const node &n) const
	{
		return deg>n.deg;
	}
}deg[MAXN];
void init()
{
	memset(g,0,sizeof(g));
	for(int i=0;i<MAXN;i++)
	{
		for(int j=0;j<MAXN;j++)
		{
			if(i==j)vis[i][j]=1;
			else vis[i][j]=0;
		}
	}
}
bool reduce(int n,int u)
{
	for(int i=0;i<n;i++)
	{
		if(!vis[deg[u].id][deg[i].id]&°[u].deg&°[i].deg)
		{
			g[deg[u].id][deg[i].id]=g[deg[i].id][deg[u].id]=vis[deg[u].id][deg[i].id]=vis[deg[i].id][deg[u].id]=1;
			deg[u].deg--;
			deg[i].deg--;
		}
	}
	return deg[u].deg==0;
}
bool build_graph(int n)
{
	int lp = n;
	while(lp--){
		sort(deg,deg+n);
		if(reduce(n,0))continue;
		else return false;
	}
	return true;
}
void solve(int n)
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(!j)cout<<g[i][j];
			else cout<<" "<<g[i][j];
		}
		cout<<endl;
	}
}
int main()
{
	int cas=0,t,n;
	cin>>t;
	while(t--)
	{
		cin>>n;
		for(int i=0;i<n;i++)cin>>deg[i].deg,deg[i].id=i,deg[i].vis=false;
		init();
		bool ok = build_graph(n);
		if(cas++)cout<<endl;
		if(ok)
		{
			cout<<"YES"<<endl;
			solve(n);
		}
		else
		{
			cout<<"NO"<<endl;
		}
	}
	return 0;
}

分享到:
评论

相关推荐

    poj 1659解题报告

    poj 1659解题报告poj 1659解题报告poj 1659解题报告poj 1659解题报告

    poj acm的AC解题报告

    ACM竞赛编程的核心在于高效地解决问题,这通常涉及到数据结构(如数组、链表、树、图等)、算法(如排序、搜索、动态规划、贪心策略等)以及优化技巧。在POJ中,题目类型多样,从简单的逻辑判断到复杂的图论问题,都...

    田忌赛马: POJ 2287(贪心解法)

    《田忌赛马:POJ 2287 贪心解法解析》 在计算机科学领域,算法是解决问题的核心。"田忌赛马"这个题目来源于古代中国的一个著名故事,而在这个故事的基础上,被引入到了编程竞赛的场景中。POJ(Programming Online ...

    POJ算法题目分类

    * 贪心:贪心算法是指通过选择当前最优的解来解决问题的方法,如 poj1328、poj2109、poj2586。 * 递归和分治法:递归和分治法是指将问题分解成多个小问题,通过解决小问题来解决大问题,如 poj3295。 * 递推:递推是...

    POJ 1129-Channel Allocation 的贪心算法解法(图的m着色问题)

    标题“POJ 1129-Channel Allocation”的问题是一个典型的图论问题,涉及到贪心算法和图的m着色问题。在这个问题中,我们假设有一个通信网络,其中的节点代表基站,每个基站需要分配一个频道来传输信号,而两个相邻的...

    poj题目分类

    * 贪心算法:通过选择当前最优的解决方案来解决问题,例如 poj1328、poj2109、poj2586。 * 递归和分治法:通过将问题拆分成小问题来解决,例如 poj3295。 * 递推法:通过逐步解决问题来获得最终解,例如 poj1068...

    POJ.rar_poj java_poj1048

    【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...

    poj各种分类

    例如,poj1328和poj2109就是典型的贪心问题。贪心算法的关键在于正确性证明,确保每一步的局部最优能够导向全局最优。 #### 分治法与递归 分治法是将大问题分解成若干个子问题,递归地求解这些子问题,然后将子问题...

    poj训练计划.doc

    - 贪心算法:在每一步选择中都采取在当前状态下最好或最优的选择,如`poj1328, poj2109, poj2586`。 - 分治法:将一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,如`poj...

    poj1087贪心算法实验报告

    在这个实验报告中,poj1087 题目就是一个典型的贪心算法应用实例。 题目描述了一个工厂需要将不同尺寸的产品(1*1 到 6*6)使用6*6的包裹进行包装,目标是最小化所需的包裹数量。贪心策略在此问题中的应用是逐个...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **例题**:poj1860, poj3259, poj1062, poj2253, poj1125, poj2240 - **解释**:最短路径算法包括Dijkstra算法、Bellman-Ford算法、Floyd算法以及堆优化的Dijkstra算法等。 ##### (3) 最小生成树算法 - **例题**...

    POJ1010-STAMPS

    【标题】"POJ1010-STAMPS"是一个编程题目,来源于北京大学的在线判题系统POJ(Problem Set of Peking University),这是一处训练程序员算法技能和编程能力的平台。该题目旨在考察参赛者对动态规划或贪心算法的理解...

    POJ_3131.zip_POJ 八数码_poj

    标题中的“POJ_3131.zip_POJ 八数码_poj”指的是一个与编程竞赛网站POJ(Problem Set Algorithm)相关的项目,具体是针对3131号问题的解决方案,该问题涉及到了八数码游戏。八数码游戏,又称滑动拼图,是一个经典的...

    POJ1201-Intervals

    代码中可能会用到动态规划、贪心算法等策略,以求在满足题目要求的同时,保证算法的时间复杂度尽可能低,从而在POJ平台上获得AC状态。而解题报告则会详细解释这些算法的应用和选择原因,以及代码的具体实现细节。

    POJ1159-Palindrome

    【标题】"POJ1159-Palindrome" 是北京大学在线编程平台POJ上的一道编程题目。这道题目主要考察的是字符串处理和回文判断的知识点。 【描述】"北大POJ1159-Palindrome 解题报告+AC代码" 暗示了解决这道问题的方法和...

    acm 题目汇总(好东西)

    连通性问题,如POJ 1236 "Network of Schools" 和 POJ 1659 "Frogs' Neighborhood",则通常需要DFS(深度优先搜索)和缩点技巧,以及对图的度数进行分析。 在ACM竞赛中,理解和掌握这些算法是至关重要的,因为它们...

    POJ2002-Squares

    【标题】"POJ2002-Squares"是一个经典的计算机编程题目,源自北京大学的在线判题系统(POJ,即PKU Online Judge)。这个题目主要涉及到算法设计和实现,尤其是数学和动态规划方面的知识。 【描述】"解题报告+AC代码...

    POJ1840-Eqs

    7. **贪心策略**:在某些情况下,可以采用贪心算法,每次做出局部最优决策,最终达到全局最优。 8. **模拟**:有些题目可能需要编写程序来模拟现实世界的某些过程,例如模拟游戏规则或物理现象。 9. **位运算**:...

    POJ题目分析与理解

    1. 算法分类:POJ题目可以根据算法的难度和类型进行分类,例如,动态规划、贪心算法、递归算法等。 2. 题目分类:POJ题目可以根据题目类型进行分类,例如,数学题、字符串处理题、图算法题等。 3. 代码长度分类:POJ...

Global site tag (gtag.js) - Google Analytics