【zzulioj-1676】与同学比身高(综合)
题目链接: http://acm.zzuli.edu.cn/problem.php?id=1676
题目描述
新学年开学了,学校又迎来了一批新同学,已知部分同学之间的身高关系,请列出可推断出的同学之间的身高关系。
输入
第一行是一个整数n,表示有n组测试数据。
每组测试数据第一行是一个正整数m(m<=100),表示已知同学之间的身高关系有m组,身高关系没有相等的情况。
接下来输入m行身高关系,每位同学用一个大写字母表示。
输出
对于第d组测试数据,首先输出“Case d:”,d从1开始。
输出能够推断出的同学之间的身高关系,按字母的字典序输出。
已知条件中的身高关系不要输出。
如果推断不出任何新的身高关系,输出NONE。
样例输入
2
3
A<B
C>B
C<D
2
A<B
C<D
样例输出
Case 1:
A<C
A<D
B<D
Case 2:
NONE
解法1:DFS
#include <bits/stdc++.h>
using namespace std;
bool vis[][];
int m;
vector<int>V[];
struct node
{
int a, b;
} q[];
bool cmp(node x, node y)
{
if(x.a == y.a) return x.b < y.b;
return x.a < y.a;
}
void dfs(int x, int y)
{
for(int i = ; i < V[y].size(); i++)
{
int v = V[y][i];
if(!vis[x][v])
{
q[++m].a = x;
q[m].b = v;
}
dfs(x, v);
}
}
int main()
{
int t, n, i;
cin>>t;
int cas = ;
while(t--)
{
scanf("%d", &n);
for(i = ; i < ; i++) V[i].clear();
memset(vis, , sizeof vis);
m = ;
while(n--)
{
char s[];
scanf("%s", s);
int a = s[] - 'A';
int b = s[] - 'A';
if(s[] == '<') V[a].push_back(b), vis[a][b] = ;
else V[b].push_back(a), vis[b][a] = ;
}
printf("Case %d:\n", ++cas);
for(i = ; i < ; i++)
dfs(i, i);
sort(q+, q++m, cmp);
for(i = ; i <= m; i++)
printf("%c<%c\n", q[i].a+'A', q[i].b+'A');
if(!m) puts("NONE");
}
return ;
}
解法2:BFS
#include <bits/stdc++.h>
using namespace std;
bool vis[][];
int m;
vector<int>V[];
struct node
{
int a, b;
} q[];
bool cmp(node x, node y)
{
if(x.a == y.a) return x.b < y.b;
return x.a < y.a;
}
int main()
{
int t, n, i;
cin>>t;
int cas = ;
while(t--)
{
scanf("%d", &n);
for(i = ; i < ; i++) V[i].clear();
memset(vis, , sizeof vis);
m = ;
while(n--)
{
char s[];
scanf("%s", s);
int a = s[] - 'A';
int b = s[] - 'A';
if(s[] == '<') V[a].push_back(b), vis[a][b] = ;
else V[b].push_back(a), vis[b][a] = ;
}
printf("Case %d:\n", ++cas);
for(i = ; i < ; i++)
{
queue<int>Q;
Q.push(i);
while(!Q.empty())
{
int t = Q.front();
Q.pop();
for(int j = ; j < V[t].size(); j++)
{
int v = V[t][j];
if(!vis[i][v])
{
q[++m].a = i;
q[m].b = v;
}
Q.push(v);
}
}
}
sort(q+, q++m, cmp);
for(i = ; i <= m; i++)
printf("%c<%c\n", q[i].a+'A', q[i].b+'A');
if(!m) puts("NONE");
}
return ;
}
解法3:并查集
#include <bits/stdc++.h>
using namespace std;
int vis[][], par[];
int main()
{
int n, m, i, j;
char s[];
cin>>n;
int cas = ;
while(n--)
{
scanf("%d", &m);
for(i = ; i < ; i++) par[i] = i;
memset(vis, , sizeof vis);
while(m--)
{
scanf("%s", s);
int a = s[] - 'A';
int b = s[] - 'A';
if(s[] == '<')
par[a] = b, vis[a][b] = ;
else
par[b] = a, vis[b][a] = ;
}
printf("Case %d:\n", ++cas);
m = ;
for(i = ; i < ; i++)
{
for(j = ; j < ; j++)
{
int k = i;
if(i == j) continue;
while()
{
k = par[k];
if(k == j && !vis[i][j])
{
printf("%c<%c\n", i+'A', j+'A');
m++;
}
if(k == par[k]) break;
}
}
}
if(!m) puts("NONE");
}
return ;
}
解法4:floyd
#include <bits/stdc++.h>
using namespace std;
int mp[][];
int main()
{
int t, n;
cin>>t;
int cas = ;
while(t--)
{
scanf("%d", &n);
memset(mp, , sizeof mp);
bool f = false;
while(n--)
{
char s[];
scanf("%s", s);
int a = s[] - 'A';
int b = s[] - 'A';
if(s[] == '<') mp[a][b] = ;
else mp[b][a] = ;
}
printf("Case %d:\n", ++cas);
for(int k = ; k < ; k++)
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
if(mp[i][k] && mp[k][j] && !mp[i][j])
mp[i][j] = , f = true;
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
if(mp[i][j] == )
printf("%c<%c\n", i+'A', j+'A');
if(!f) puts("NONE");
}
return ;
}
【zzulioj-1676】与同学比身高(综合)的更多相关文章
- 3219: 求最高同学位置—C语言版
3219: 求最高同学位置—C语言版 时间限制: 1 Sec 内存限制: 128 MB提交: 207 解决: 115[提交][状态][讨论版][命题人:smallgyy] 题目描述 设一维数组存放 ...
- 华为oj 刷题记录之合唱团
华为OJ-合唱队 描述 计算最少出列多少位同学,使得剩下的同学排成合唱队形 说明: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队 ...
- [tem]Longest Increasing Subsequence(LIS)
Longest Increasing Subsequence(LIS) 一个美丽的名字 非常经典的线性结构dp [朴素]:O(n^2) d(i)=max{0,d(j) :j<i&& ...
- 最长公共子序列(LCS)和最长递增子序列(LIS)的求解
一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...
- TYVJ P1067 合唱队形 Label:上升子序列?
背景 NOIP2004 提高组 第三道 描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号 ...
- NOIP200407合唱队形+最长上升子序列O(n^2)详解
合唱队形解题报告 2016-05-12 4:30——6:45 NOIP200407合唱队形 难度级别:A: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:20000 ...
- tyvj 1067 dp 两次LIS(nlogn)
P1067 合唱队形 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2004 提高组 第三道 描述 N位同学站成一排,音乐老师要请其中的(N ...
- [NOIP 2014复习]第三章:动态规划——NOIP历届真题回想
背包型动态规划 1.Wikioi 1047 邮票面值设计 题目描写叙述 Description 给定一个信封,最多仅仅同意粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定全部的邮票数量都 ...
- 基于RealSense的坐姿检测技术
计算机的飞速普及,让人们将越来越多的工作放在计算机上去完成,各行各业,尤其是程序开发人员.文字工作者,在计算机上的工作时间越来越长,这种情况下不良的坐姿对颈肩腰椎都会产生很大影响,容易导致多种疾病的发 ...
随机推荐
- Java保留字和关键字
Java的关键字:java的关键字对Java的编译器有着特殊的意义,它们表示一种数据类型或者程序的结构相关. Java的保留字:为Java预留的关键字,现在还没用到,但在新Java的版本升级中可能会用 ...
- python 各种魔法方法
目录 自定义序列 反射
- corethink功能模块探索开发(十四)后台编辑按钮
效果图: 1.添加下图55&58行代码 2.实现edit方法 位于Equip/Admin/DeviceRepaireAdmin.class.php中 public function edit( ...
- Python高阶函数-闭包
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 在这里我们首先回忆一下python代码运行的时候遇到函数是怎么做的. 从python解释器开始执行之后,就在内存中开辟了一个空间 每当 ...
- BCB直接访问硬件端口和物理内存 - WinIO的应用
BCB直接访问硬件端口和物理内存 - WinIO的应用 (读硬盘参数和主板BIOS信息, 支持 Win9x/NT/2k/XP/2003) 关于直接访问端口, 有很多网站很多文章都讨论过, 但总找不到非 ...
- CROS跨域 解决方案 之 tomcat 做过滤处理解决
摘自:http://www.cnblogs.com/liuwenhao-1/articles/6963540.html 1 .在项目中常常遇到本地访问服务器上的链接数据访问不到,并出现如下问题: 这是 ...
- win7 64位下使用regsvr32注册activex dll .
由于公司产品用了很多activex dll,而我的操作系统是64位的win7,在注册这些dll时碰到了很多问题,经过摸索,最后还是成功注册了,步骤如下: 1.在C:\Windows\SysWOW64\ ...
- 微软名人数据集 ms_celeb_1m 处理(MsCelebV1-Faces-Aligned.tsv)python脚本
本文主要介绍了如何对MsCelebV1-Faces-Aligned.tsv文件进行提取 原创by南山南北秋悲 欢迎引用!请注明原地址 http://www.cnblogs.com/hwd9654/p/ ...
- Linux静默安装Oracle
打算在云服务器上装oracle服务,以前DBA美眉都是在图形化界面下安装,这次抓瞎了.赶紧上网查查,静默安装可以解决问题.于是乎赶紧开始部署,过程如下.安装环境:操作系统:CentOS 7内存:11G ...
- Nginx rewrite配置
rewrite应用 Rewrite模块设置及Wordpress和Discuz的示例.Nginx的Rewrite规则比Apache的简单灵活多了,从下面介绍可见一斑. rewrite配置 Nginx可以 ...