题目链接: 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. Andrew Ng机器学习编程作业:Regularized Linear Regression and Bias/Variance

    作业文件: machine-learning-ex5 1. 正则化线性回归 在本次练习的前半部分,我们将会正则化的线性回归模型来利用水库中水位的变化预测流出大坝的水量,后半部分我们对调试的学习算法进行 ...

  2. bitmap位图法

    位图法定义 位图法就是bitmap的缩写,所谓bitmap,是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况.通常是用来判断某个数据存不存在的. 例如,要判断一千万个人的状态,每 ...

  3. c++ 11nullptr

    1. 引入nullptr的原因 引入nullptr的原因,这个要从NULL说起.对于C和C++程序员来说,一定不会对NULL感到陌生.但是C和C++中的NULL却不等价.NULL表示指针不指向任何对象 ...

  4. Appium中的logger

    原文地址http://blog.csdn.net/itfootball/article/details/45395901 appium中的log输出量很大,我们分析问题的时候会依赖于这些log,但是你 ...

  5. linq中将int类型转换为string类型,toString()报错

    今天同事在调试程序的时候,报了一个不寻常的错误, “LINQ to Entities 不识别方法"System.String ToString()",因此该方法无法转换为存储表达式 ...

  6. List和Set区别

    1. Set 接口实例存储的是无序的,不重复的数据.List 接口实例存储的是有序的,可以重复的元素. 2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有Ha ...

  7. Lambda加自定义比较器实现两个列表的合并

    一次项目有这样的需求,本地存储了json数据,可以转化为对应的List列表,现在需要更新,从服务器那里获取最新的数据更改.总的来说就是本地有个List表,如果数据需要更新,则会向服务器发送请求来获取需 ...

  8. [国家集训队] Crash 的文明世界(第二类斯特林数)

    题目 [国家集训队] Crash 的文明世界 前置 斯特林数\(\Longrightarrow\)斯特林数及反演总结 做法 \[\begin{aligned} ans_x&=\sum\limi ...

  9. MySQL-checkpoint技术

    几个知识点: 缓冲池:缓存磁盘数据,通过内存速度弥补CPU速度和磁盘速度的鸿沟. 脏页:LRU列表中被修改的页,和磁盘上的数据不一致 刷新频率:每次有脏页就刷新,开销很大.需要一种刷新机制 数据丢失: ...

  10. C++结构体定义和C的区别

    对于C来说,struct定义的结构体不是一种数据类型,所以每次声明的时候需要加上struct让编译器知道这是结构体,为了不每次都加上struct关键字,可以在定义结构体的时候加上typedef关键字: ...