Codeforces Round #228 (Div. 1)-B-Fox and Minimal path

2014-11-24 08:40:41 · 作者: · 浏览: 0

做法:

输入一个数n(例如n=11)。

把n转化成二进制为(1011)。

那么11构造出来的图为:

\

从点1到点2有三条路,分别为路1,2,3。< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+yP3M9cK3t9ax8MrHMTAxMdbQtcTI/bj2MaOsvLSw0TExt9bA67PJOCYjNDM7MiYjNDM7MaGjPC9wPgo8cD4xwrfJz7fWwOuz9sC0OMz1wrejrDg9MioyKjKjuzwvcD4KPHA+MsK3yc+31sDrs/bAtDLM9cK3o6wyPTKjuzwvcD4KPHA+M8K3yc+31sDrs/bAtDHM9cK3oaM8L3A+CjxwPrDRy/nT0LXEteO7rbP2wLS8tM6qo7o8L3A+CjxwPjxpbWcgc3JjPQ=="https://www.cppentry.com/upload_files/article/49/1_f9gfi__.jpg" alt="\">

红色的点代表图中的点,黑色的线是边。

这样,点1到点2之间就有8+2+1条最短路了。

总体思路:

把一个输入的数n转化成2进制,在2进制中有多少个1,就分离出来多少条路,每条路存在2^x条最短路。

注意:

比赛的时候由于怕二进制的时候点会不够,就转化成3进制做的。

#include
  
   
#include
   
     #include
    
      #include
     
       #include
      
        #include
       
         using namespace std; #define LL __int64 #define maxn 50000001 int maps[1001][1001]; int biao[101]; int lens; int nums; int st; void chu(int x) { lens=0; nums=0; while(x) { if(x%3) { biao[lens]=x%3; nums++; } else biao[lens]=0; lens++; x=x/3; } } void 
        dos() { int i,j; for(i=1;i<=st;i++) { for(j=1;j<=st;j++) { if(maps[i][j])maps[j][i]=1; } } } int main() { int n,i,j,k; int ans; while(~scanf("%d",&n)) { chu(n);//把n转化成3进制 st=3; vector
        
         vec; for(i=0;i