在某个直播间里,观众常常会发送类似这样的弹幕:
鱼越大,鱼刺越大;鱼刺越大,肉越少;肉越少,鱼越小;所以鱼越大,鱼越小
这样通过一连串推导得出一个搞笑的结论的弹幕发送者被称为“相对论大师”。
现在给定一系列已有的推论,请你从给定的推论中挑选一些,组成一条类似于上面的弹幕,成为一名“相对论大师”。
输入格式:
输入第一行是一个正整数 N (1≤N≤1000),表示总共有多少条推论。
接下来的 N 行,每行有两对四个元素,形如下:
A 0 B 1
每对元素表示一个论点:第一个是一个长度不大于 5 的、只包含大小写字母的字符串,称为论点的核心;第二个数字固定为 0 或者 1,代表论点核心的方向属性。为简单理解,你可以将 0 理解为正面方向,1 理解为负面方向。例如:
YuCi 0 Rou 1
就可以理解为鱼刺大,肉少
。
于是一行中的两个论点就形成一条推论,表示第一个核心某个方向的属性能推出第二个核心的某个方向的属性,即鱼刺越大,肉越少
。
输出格式:
按照弹幕格式输出一行,例如:
Yu 0 YuCi 0 YuCi 0 Rou 1 Rou 1 Yu 1 = Yu 0 Yu 1
具体格式要求为:在一行中输出从起始论点到最终论点的所有推论,论点格式与输入相同,论点间以1个空格分隔。随后输出等号(等号前后均有1个空格),最后是相互矛盾的起始和终止论点。
如果有多种方案,选择使用推论最少的;推论条数相同的输出任意一种方案均可。
在方案中每条推论仅可使用一次。保证有解,且给定的推论中没有相同的推论。
输入样例:
5
Yu 0 Yuci 0
Rou 1 Yu 1
Yuci 0 Rou 1
Yuci 0 Gutou 0
Gutou 0 Rou 0
输出样例:
Yu 0 Yuci 0 Yuci 0 Rou 1 Rou 1 Yu 1 = Yu 0 Yu 1
提示:
本题返回结果若为格式错误均可视为答案错误。
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
思路:就是存图找最短路,然后用一个bfs进行搜索,这里借鉴的大佬的代码 ,大佬的代码机器精巧,特别是bfs部分,我简单做了下标记,结构可以用来借鉴一下2023睿抗机器人开发大赛CAIP-编程技能赛-本科组(省赛)_2022 睿抗caip-编程技能赛-本科组(省赛)-CSDN博客
#include "bits/stdc++.h" using namespace std; map<string , vector<string> > g; map<string, string> pre;//用来存储路径 map<string, int> num, mp;//用来存储推论的数量 int mn = 1e9; int bfs(string s1, string s2){ pre.clear(); num.clear(); queue<string> q; q.push(s1); while(q.size()){ string t = q.front(); q.pop(); if(t == s2) return num[t]; for(auto x : g[t]){ if(num.find(x) != num.end()) continue;//防止路径重复 pre[x] = t; num[x] = num[t] + 1; q.push(x); } } return -1; } int main(){ int n; cin>>n; string s1, s2, s3, s4; string ans1, ans2; getchar(); while(n--){ cin>>s1>>s2>>s3>>s4; mp[s1] = 1, mp[s3] = 1; s1 = s1 + " " + s2; s3 = s3 + " " + s4; g[s1].push_back(s3); } for(auto x : mp){ string s1 = x.first + " 0"; string s2 = x.first + " 1"; int sb = bfs(s1, s2); if(sb != -1 && sb < mn){ mn = sb; ans1 = s1, ans2 = s2;//找最短路 } sb = bfs(s2, s1); if(sb != -1 && sb < mn){ mn = sb; ans1 = s2, ans2 = s1; } } int dig = bfs(ans1, ans2); vector<string> v; string cans2 = ans2; while(cans2 != ans1){ v.push_back(cans2); cans2 = pre[cans2]; } v.push_back(ans1); reverse(v.begin(), v.end()); for(int i = 0; i < v.size(); i ++){ cout<<v[i]<<" "; if(i < v.size() - 2) cout<<v[i + 1] <<" "; } cout<<"= "<<ans1<<" "<<ans2; return 0; }