【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的坐姿检测技术
计算机的飞速普及,让人们将越来越多的工作放在计算机上去完成,各行各业,尤其是程序开发人员.文字工作者,在计算机上的工作时间越来越长,这种情况下不良的坐姿对颈肩腰椎都会产生很大影响,容易导致多种疾病的发 ...
随机推荐
- jquery请求数据
$(document).ready(function() { $.ajax({ url: "http://123.207.88.84:8080/zdm/AppApi/Search/Categ ...
- tensorflow 中 name_scope 及 variable_scope 的异同
Let's begin by a short introduction to variable sharing. It is a mechanism in TensorFlow that allows ...
- beego——过滤器
beego支持自定义过滤中间件,例如安全验证.强制跳转等. 过滤器函数如下所示: beego.InsertFilter(pattern string, position int, filter Fil ...
- sqlserver建立相同的表结构
select * into purpose from source 来自为知笔记(Wiz)
- Django-进阶之路--信号
Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...
- 第七课 GDB调试 (下)
1序言: 通过前面一节第六课 GDB调试 (下)文章,可以掌握理解了gdb调试:怎么启动.运行,打断点.查看变量.甚至改变变量等的知识,今天来大概讲解下调试bug的类型. 2知识点: 2.1 就像之前 ...
- oracle中记录被另一个用户锁住的原因与解决办法
oracle数据中删除数据时提示“记录被另一个用户锁住” 解决方法: 1.查看数据库锁,诊断锁的来源及类型: select object_id,session_id,locked_mode from ...
- ubuntu下关于profile和bashrc中环境变量的理解
(0) 写在前面 有些名词可能需要解释一下.(也可以先不看这一节,在后面看到有疑惑再上来看相关解释) $PS1和交互式运行(running interactively): 简单地来说,交互式运行就是在 ...
- Web开发相关笔记
1.MySQL命令行下执行.sql脚本详解http://database.51cto.com/art/201107/277687.htm 在可视化工具里导出.sql脚本 --> 放命令行里运行 ...
- readonly、disabled、display、visible的区别
display和visible的区别: (1)首先说明的是display:none和visible:hidden都能够实现将网页上某个元素隐藏起来. (2)如果在样式文件或页面文件代码中直接用disp ...