今天早上,我们做了场比赛,里面有一个题目是这样的。。
题目大意:
随着马场的繁荣,出现了越来越多的新马种。种族之间的沟通不畅严重影响了马场的和谐。这时,科学家发明了马语翻译机器人,正好可以解决这一难题。
机器人有 M 种,每种机器人能完成 K 个马种之间的语言翻译。问,利用这些机器人,能否实现 1 种群和 N 种群的马语翻译。 若可以,找到翻译过程至少需要用到多少种语言。
解析:
其实这道题目用最短路跑一片就可以了,无需任何玩意儿。。。。
但是我还是桀骜不驯,来吧,召唤白番薯(BFS)!!
其实BFS与最短路(spfa)差不多,但是对于最短路来说,我还是喜欢BFS(因为我背过板子)
问题:
初次看这到题目时,我的心里还是有点懵逼。。。。
所以还是要看看标的。。。。
但是最重要的就是"我卢本伟没有扣标!!!!!!!"
给大家伙们看看我遇到的问题吧:
1 void bfs() 2 { 3 int head = 0,tail = 1; 4 q[1] = 1; 5 vis[1] = 1; 6 while (head ^ tail) //蓝色 7 { 8 int x = q[++head]; 9 for (int j = lnk[x];j;j = nxt[j]) 10 if (!vis[son[j]]) 11 { 12 vis[son[j]] = 1; 13 dis[son[j]] = dis[x] + 1; 14 q[++tail] = son[j]; 15 } 16 } 17 }
就是那蓝蓝的玩意儿!!!!
那是啥?????
于是
一波询问
终于
搞懂了
"Please start your AK show"
解决:
先来普及一下异或:
1 i xor j
看这个玩意儿↑
诶!!!
打住!!!
这可是c++专场,Pascal怎么进来了(快走!!!);
1 i ^ j
这才对!!
看:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不 带进位,所以异或常被认作不进位加法。
异或略称为XOR、EOR、EX-OR
程序中有三种演算子:XOR、xor、⊕。
使用方法如下
z = x ⊕ y
z= x xor y
end.
现在到BFS了
1 void BFS() 2 { 3 int head=0; 4 int tail=1; 5 while(head^tail) 6 { 7 //Lazy to write labels........... 8 } 9 }
一般循环里都是head<tail的
可是他不是
我瞬间懵了。。。
后来才知道
如果head==tail
则为FALSE
不然为
TRUE
这我才知道
相信你也懂了!!!!
(一直bb)
最后
我只想说,作比赛有好多人都预知未来。。。。
bye~~~