关于BFS+异或(C++)

时间:2019-08-22
本文章向大家介绍关于BFS+异或(C++),主要包括关于BFS+异或(C++)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

今天早上,我们做了场比赛,里面有一个题目是这样的。。

题目大意:

         随着马场的繁荣,出现了越来越多的新马种。种族之间的沟通不畅严重影响了马场的和谐。这时,科学家发明了马语翻译机器人,正好可以解决这一难题。
          机器人有 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~~~

原文地址:https://www.cnblogs.com/WestJackson/p/11396693.html