题目链接: 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】与同学比身高(综合)的更多相关文章

  1. 3219: 求最高同学位置—C语言版

    3219: 求最高同学位置—C语言版 时间限制: 1 Sec  内存限制: 128 MB提交: 207  解决: 115[提交][状态][讨论版][命题人:smallgyy] 题目描述 设一维数组存放 ...

  2. 华为oj 刷题记录之合唱团

    华为OJ-合唱队 描述 计算最少出列多少位同学,使得剩下的同学排成合唱队形 说明: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队 ...

  3. [tem]Longest Increasing Subsequence(LIS)

    Longest Increasing Subsequence(LIS) 一个美丽的名字 非常经典的线性结构dp [朴素]:O(n^2) d(i)=max{0,d(j) :j<i&& ...

  4. 最长公共子序列(LCS)和最长递增子序列(LIS)的求解

    一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...

  5. TYVJ P1067 合唱队形 Label:上升子序列?

    背景 NOIP2004 提高组 第三道 描述     N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号 ...

  6. NOIP200407合唱队形+最长上升子序列O(n^2)详解

    合唱队形解题报告 2016-05-12   4:30——6:45 NOIP200407合唱队形 难度级别:A: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:20000 ...

  7. tyvj 1067 dp 两次LIS(nlogn)

    P1067 合唱队形 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2004 提高组 第三道 描述     N位同学站成一排,音乐老师要请其中的(N ...

  8. [NOIP 2014复习]第三章:动态规划——NOIP历届真题回想

    背包型动态规划 1.Wikioi 1047 邮票面值设计 题目描写叙述 Description 给定一个信封,最多仅仅同意粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定全部的邮票数量都 ...

  9. 基于RealSense的坐姿检测技术

    计算机的飞速普及,让人们将越来越多的工作放在计算机上去完成,各行各业,尤其是程序开发人员.文字工作者,在计算机上的工作时间越来越长,这种情况下不良的坐姿对颈肩腰椎都会产生很大影响,容易导致多种疾病的发 ...

随机推荐

  1. ORACLE性能优化- Buffer cache 的调整与优化

    Buffer Cache是SGA的重要组成部分,主要用于缓存数据块,其大小也直接影响系统的性能.当Buffer Cache过小的时候,将会造成更多的 free buffer waits事件. 下面将具 ...

  2. Xilinx中解决高扇出的方法

    Fanout,即扇出,指模块直接调用的下级模块的个数,如果这个数值过大的话,在FPGA直接表现为net delay较大,不利于时序收敛.因此,在写代码时应尽量避免高扇出的情况.但是,在某些特殊情况下, ...

  3. path的join和resolve的使用区别

    文章目录   1.连接路径:path.join([path1][, path2][, ...]) 2.路径解析:path.resolve([from ...], to) 3.对比 1.连接路径:pat ...

  4. jQuery Mobile 手动显示ajax加载器

    在jquery mobile开发中,经常需要调用ajax方法,异步获取数据,如果异步获取数据方法由于网速等等的原因,会有一个反应时间,如果能在点击按钮后数据处理期间,给一个正在加载的提示,客户体验会更 ...

  5. python sqlite

    1.导入Python SQLITE数据库模块 Python2.5之后,内置了SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可~ import sqlite3 2. 创建/打开数据库 ...

  6. Python(调用函数、定义函数)

    函数的返回值: return 值:只能返回一次,只要执行return函数就终止 返回值:没有类型限制,也没有个数限制 没有return:None 返回一个值 返回多个值:元组 先定义,后使用,定义阶段 ...

  7. 再谈WinIO初始化异常

    再谈WinIO初始化异常     前段时间WinIO在我的新项目中总是初始化失败,有时候又是好好的,很让人费解.修改了源代码显示了很多调试信息后,也没有什么太多的收获.由于我们的工控卡必须要用这个库, ...

  8. Delphi 正则表达式语法(8): 引用子表达式 - 也叫反向引用

    Delphi 正则表达式语法(8): 引用子表达式 - 也叫反向引用 //准备: 我们先写一个搜索所有英文单词的表达式 var   reg: TPerlRegEx; begin   reg := TP ...

  9. Delphi 正则表达式起步

    Delphi 正则表达式起步 在 Delphi 中使用正则表达式, 目前 PerlRegEx 应该是首选, 准备彻底而细致地研究它. 官方网站: http://www.regular-expressi ...

  10. js 三元表达式 复杂写法

    a = 0 b = 0 a === 0 && (a = 1,b = 2) a === 1 ? (a = 3,alert(b)) : (b = 4) a === 1 || alert(a ...