题意与分析
2018ICPC北京站A题。
题意是这样的,给定若干人的武力值大小(A B
的意思是A比B厉害),问到第几行会出现矛盾。
这题不能出现思维定势,看到矛盾就是矛盾并查集——A>B、A>C是不能推出B>C或者B<C的。相反,大于小于是一种偏序关系,是可以建立有向图的。那么,如果这个有向图中出现了环,就是矛盾的。
问题于是转化为有向图判环问题,这里简单说一下有向图和无向图的判环方法。
a) 无向图
- 删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一。
- 将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一。
最后如果最后还有未删除顶点,则存在环,否则没有环。
b) 有向图
对于n个节点的有向图,令cnt = 0。
- 将所有入度为0的节点入队;
- 将队头节点v出队,cnt++,直至队列为空;
- 遍历与v相连的节点,并将相连节点的入度减一,若入度变为0,将此节点入队。
最后,若cnt==n,访问到所有节点,完成拓扑排序(这是出队顺序的意义),否则,存在环。
代码
/* ACM Code written by Sam X or his teammates.
* Filename: a.cpp
* Date: 2018-11-17
*/
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define PB emplace_back
#define MP make_pair
#define fi first
#define se second
#define rep(i,a,b) for(repType i=(a); i<=(b); ++i)
#define per(i,a,b) for(repType i=(a); i>=(b); --i)
#define ZERO(x) memset(x, 0, sizeof(x))
#define MS(x,y) memset(x, y, sizeof(x))
#define ALL(x) (x).begin(), (x).end()
#define QUICKIO \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
#define DEBUG(...) fprintf(stderr, __VA_ARGS__), fflush(stderr)
using namespace std;
using pi=pair<int,int>;
using repType=int;
using ll=long long;
using ld=long double;
using ull=unsigned long long;
const int MAXN=25;
vector<int> G[MAXN];
vector<pi> edges;
void add_edge(int u,int v)
{
edges.PB(u,v);
G[u].PB(edges.size()-1);
}
int vis[MAXN];
int n;
unordered_map<string,int> ma;
vector<string> idx;
int gh(string str)
{
if(ma.find(str)==ma.end())
{
idx.PB(str);
return ma[str]=idx.size()-1;
}
return ma[str];
}
bool has_loop()
{
int cnt=0;
queue<int> q;
int deg[MAXN];
ZERO(deg);
rep(i,0,int(edges.size())-1)
{
deg[edges[i].se]++;
}
rep(i,0,idx.size()-1)
if(deg[i]==0)
{
q.push(i);
}
while(!q.empty())
{
//cout<<"Now: "<<q.front()<<endl;
cnt++;
auto now=q.front(); q.pop();
rep(i,0,int(G[now].size())-1)
{
deg[edges[G[now][i]].se]--;
if(deg[edges[G[now][i]].se]==0)
q.push(edges[G[now][i]].se);
}
}
//cout<<cnt<<" and "<<idx.size()<<endl;
return cnt!=idx.size();
}
int
main()
{
while(cin>>n)
{
bool ok=true;
idx.clear();
ma.clear();
rep(i,0,20) G[i].clear();
edges.clear();
rep(i,1,n)
{
string stra,strb;
cin>>stra>>strb;
if(!ok) continue;
int u=gh(stra), v=gh(strb);
//cout<<"Add: "<<u<<" "<<v<<endl;
add_edge(u,v);
if(has_loop())
{
cout<<stra<<" "<<strb<<endl;
ok=false;
}
}
if(ok) cout<<0<<endl;
}
return 0;
}
「日常训练」Jin Yong’s Wukong Ranking List(HihoCoder-1870)的更多相关文章
-
hihoCoder #1870 : Jin Yong’s Wukong Ranking List-闭包传递(递归) (ACM-ICPC Asia Beijing Regional Contest 2018 Reproduction A) 2018 ICPC 北京区域赛现场赛A
P1 : Jin Yong’s Wukong Ranking List Time Limit:1000ms Case Time Limit:1000ms Memory Limit:512MB Desc ...
-
「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)
题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...
-
「日常训练」 Fire!(UVA-11624)
与其说是训练不如说是重温.重新写了Java版本的代码. import java.util.*; import java.math.*; import java.io.BufferedInputStre ...
-
「日常训练」COMMON 约数研究(HYSBZ-1968)
题意与分析 感谢https://www.cnblogs.com/Leohh/p/7512960.html的题解.这题话说原来不在我的训练范围,正好有个同学问我,我就拿来做做.数学果然不是我擅长的啊,这 ...
-
「日常训练」 Mike and Fun (CFR305D2B)
题意(CodeForces 548B) 每次对01矩阵中的一位取反,问每次操作后,单列中最长连续1的长度. 分析 非常非常简单,但是我当时训练的时候WA了四次...无力吐槽了,人间 不值得.jpg 代 ...
-
「日常训练」Common Subexpression Elimination(UVa-12219)
今天做的题目就是抱佛脚2333 懂的都懂. 这条题目干了好几天,最后还是参考别人的代码敲出来了,但是自己独立思考了两天多,还是有收获的. 思路分析 做这条题我是先按照之前的那条题目(The SetSt ...
-
「日常训练」Magic Stones(CodeForces-1110E)
题意 给定两个数组c和t,可以对c数组中的任何元素变换\(c_i\)成\(c_{i+1}+c_{i-1}-c_i\),问c数组在若干次变换后能否变换成t数组. 分析 这种魔法题目我是同样的没做过. ...
-
「日常训练」Jongmah(Codeforces-1110D)
题意 你有n个数字,范围[1, m],你可以选择其中的三个数字构成一个三元组,但是这三个数字必须是连续的或者相同的,每个数字只能用一次,问这n个数字最多构成多少个三元组? 分析 根据官方Editori ...
-
「日常训练」The Necklace(UVA-10054)
代码 for(int i=0; i!=n; ++i) { int u = cin.nextInt(); int v = cin.nextInt(); edges.add(new Edge(u,v)); ...
随机推荐
-
iOS 8.0后使用UIAlertController
iOS 8的新特性之一就是让接口更有适应性.更灵活,因此许多视图控制器的实现方式发生了巨大的变化.全新的UIPresentationController在实现视图控制器间的过渡动画效果和自适应设备尺寸 ...
-
HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)
题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...
-
MVC &ndash; 7.Razor 语法
7.1 Razor视图引擎语法 Razor通过理解标记的结构来实现代码和标记之间的顺畅切换. @核心转换字符,用来 标记-代码 的转换字符串. 语境A: @{ string rootName=&quo ...
-
microsoft的罗马帝国——浪潮之巅
其实开始读微软的这篇已经比较久了,从来学校的前一天晚上等车的时候就开始读了,直到今天才看完.嗯,微软的确是个帝国. 那就从头开始讲把,关于帝国的传奇都是比较长的故事呢.至于我的叙述水平和我的知识水平都 ...
-
让这三个月来的更猛烈些吧,前端react同构项目
昨天一篇文章讲述了我在这三个月中由.net到java的过程,其中踩坑填坑的细节真不是三言两语可以道尽,而完成时的喜悦也远非寻常可比(仅次于涨工资).然而到这并不算完结,作为前后端分离的忠实粉丝,我认为 ...
-
jdk源码->;集合->;HashSet
类的属性 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, ...
-
WinForm文件说明
以上位置,双击即可. 界面可以通过拖动控件,也可以通过背后的界面代码去布局. 如果删除了事件代码,界面可能报错,因为界面代码中有未删除的残余(波浪线提示处代码,直接删除即可). 对于多个窗体,Prog ...
-
Recurrent Neural Networks(RNN) 循环神经网络初探
1. 针对机器学习/深度神经网络“记忆能力”的讨论 0x1:数据规律的本质是能代表此类数据的通用模式 - 数据挖掘的本质是在进行模式提取 数据的本质是存储信息的介质,而模式(pattern)是信息的一 ...
-
jmx - first demo
1. pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://ww ...
-
CVE-2018-15688 systemd dhcp6组件越界写漏洞分析
编译的话 , 用 ubuntu 18.10, 没有 patch 的源码下载路径 https://codeload.github.com/poettering/systemd/zip/3941f8329 ...