JGOJ P1068:关系推断#弗洛伊德算法
发布日期:2021-06-29 02:23:26 浏览次数:2 分类:技术文章

本文共 1748 字,大约阅读时间需要 5 分钟。

**弗洛伊德算法

核心代码

1     for(k=1;k<=n;k++)  2     for(i=1;i<=n;i++)  3     for(j=1;j<=n;j++)  4     if(e[i][j]>e[i][k]+e[k][j])  5                      e[i][j]=e[i][k]+e[k][j];

P1068:关系推断:

描述

给你一些已经确定的元素之间的关系,请你判断是否能从这些元素关系中推断出其他的元素关系。

输入

输入的第一行是一个整数N,表示测试数据的组数。

每组输入首先是一个正整数m(m<=100),表示给定元素关系的个数。
接下来m行,每行一个元素关系,格式为:
元素1<元素2 或者 元素1>元素2
元素用一个大写字母表示,输入中不会包含冲突的关系。

输出

对于每组输入,第一行输出“Case d:”,d是测试数据的序号,从1开始。

接下来输出所有推断出的新的元素关系,按照字典序从小到大排序,格式为:
元素1<元素2
每个元素关系占一行,输入中给定的元素关系不要输出。
如果没有新的元素关系推断出来,则输出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

HINT

弗洛伊德算法

#include 
#include
#include
using namespace std;int main(){
int n; cin >> n; for (int i = 1; i <= n; i++) {
int m; cin >> m; int a[26][26]; for (int i = 0; i < 26; i++) {
for (int j = 0; j < 26; j++) {
if (i == j) {
a[i][j] = 0; } else a[i][j] = 99; } } int max1 = 0; for (int i = 0; i < m; i++) {
string b; cin >> b; if (b[1] == '<') {
a[int(b[2]) - 65][int(b[0]) - 65] = 1; } else if (b[1] == '>') {
a[int(b[0]) - 65][int(b[2]) - 65] = 1; } max1 = max(max(int(b[2]) - 65, int(b[0]) - 65), max1); } for (int k = 0; k <= max1; k++) {
for (int i = 0; i <= max1; i++) {
for (int j = 0; j <= max1; j++) {
if (a[i][j] > a[i][k] + a[k][j]) {
a[i][j] = a[i][k] + a[k][j]; } } } } cout << "Case " << i <<":"<< endl; int cnt = 0; for (int j = 0; j <= max1; j++)//按字典序输出 {
for (int i = 0; i <= max1; i++) {
if (a[i][j] != 99 && a[i][j] != 0 && a[i][j] != 1) {
cnt++; cout << char(j + 65) << "<" << char(i + 65) << endl; } } } if (cnt == 0) {
cout << "NONE" << endl; } }}

转载地址:https://blog.csdn.net/YYDS777/article/details/113819183 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:快速幂# 笔记
下一篇:Ambari2.7.3自定义汉化

发表评论

最新留言

不错!
[***.144.177.141]2024年04月09日 22时11分05秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章