XYLX 10.19 環遊世界(travel)

XYLX 10.19 環遊世界(travel)


題目描述


在 Cai0715 的世界裏,總共有 N 個城市,每兩個城市之間都被一條無向的道路連接。 某一天,Boboo 來 Cai0715 的世界遊玩,由於這個世界太過於神奇,使他產生了一種環遊世界的衝動,但他必須按照下面的規則進行環遊。·他必須在一個城市開始環遊,在另一個世界結束環遊。·他環遊世界時必須經過所有的城市一次,且只能經過一次。·他環遊世界時必須經過 N-1 條道路,且只能經過 N-1 條道路。·由於某些道路的風景非常漂亮,所以 Boboo 想要在他環遊世界的過程中必須經過這些道路。現在,給定你一些必須經過的道路,問 Boboo 環遊世界的方案有多少種?


輸入輸出


輸入文件

第一行,一個數 N,代表共有 N 個城市。
以下是一個 N 行 N 列的字符矩陣 A,如果 A[I][J]是 Y 則代表城市 I 和城市 J 之間這條
道路必須被經過。

輸出文件

一行,一個數,Boboo 環遊世界的方案數。由於最後答案可能很大,所以只需要將答案 mod 1000000007 輸出即可。

樣例


樣例輸入

3
NYN
YNN
NNN

樣例輸出

4

註釋


【樣例解釋】

1、 1->2->3
2、 2->1->3
3、 3->1->2
4、 3->2->1

【數據範圍】

對於 30%的數據,2<=N<=5。 對於 50%的數據,2<=N<=20。 對於 100%的數據,2<=N<=50。

分析

該題直接排列,將必走路轉化爲一條鏈每條鏈有兩種方案,然後(鏈+孤立點)!*(2)^(鏈數)

代碼如下

program travel;
const mp=1000000007;
var i,j,total,n,have,ans,x:longint;
    visited,exist:array[1..50] of boolean;
    father:array[1..50] of integer;
    map:array[1..50,1..50] of boolean;
    ch:char;
    factorial:array[0..50] of longint;
procedure dfs(i,step:longint);
var j:longint;
begin
 visited[i]:=true;
 for j:=1 to n do
  begin
   if map[i,j] and (not visited[j]) then
    begin
     father[j]:=i;
     dfs(j,step+1);
     visited[j]:=false;
    end;
  end;
 if (step<>1) and (map[i,x])
  then
   begin
    write(0);
    close(input);
    close(output);
    halt;
   end;
end;

begin
 assign(input,'D:/input/XYLX/10.19/travel.txt');
 reset(input);
 assign(output,'D:/output/XYLX/10.19/travel.txt');
 rewrite(output);
 readln(n);
 fillchar(exist,sizeof(exist),false);
 for i:=1 to n do
  begin
   for j:=1 to n do
    begin
     read(ch);
     if ch='Y'
      then
       begin
        map[i,j]:=true;
        exist[i]:=true;
       end
      else map[i,j]:=false;

    end;
   readln;
  end;
 for i:=1 to n do father[i]:=0;
 have:=0;
 for x:=1 to n do
  begin
   if (father[x]=0) and (exist[x])
    then
     begin
      inc(total);
      dfs(x,0);
     end;
   if not exist[x]
    then
     begin
      inc(have);
     end;
  end;
 ans:=1;
 factorial[0]:=1;
 for i:=1 to n do
  factorial[i]:=((i mod mp)*(factorial[i-1] mod mp)) mod mp;
 for i:=1 to total do
  begin
   ans:=(ans*2) mod mp;
  end;
 ans:=(ans * (factorial[have+total] mod mp)) mod mp;
 write(ans);
 close(input);
 close(output);
end.

我好想你

生命 隨年月流去 隨白髮老去
隨着你離去 快樂渺無音訊
隨往事淡去 隨夢境睡去
隨麻痹的心逐漸遠去

我還想你
蘇打綠
開了燈 眼前的模樣
偌大的房 寂寞的牀
關了燈 全都一個樣
心裏的傷 無法分享
生命 隨年月流去 隨白髮老去
隨着你離去 快樂渺無音訊
隨往事淡去 隨夢境睡去
隨麻痹的心逐漸遠去
我好想你 好想你
卻不露痕跡
我還踮着腳思念
我還任記憶盤旋
我還閉着眼流淚
我還裝作無所謂
我好想你 好想你
卻欺騙自己
開了燈 眼前的模樣
偌大的房 寂寞的牀
關了燈 全都一個樣
心裏的傷 無法分享
生命 隨年月流去 隨白髮老去
隨着你離去 快樂渺無音訊
隨往事淡去 隨夢境睡去
隨麻痹的心逐漸遠去
我好想你 好想你
卻不露痕跡
我還踮着腳思念
我還任記憶盤旋
我還閉着眼流淚
我還裝作無所謂
我好想你 好想你
卻欺騙自己
我好想你 好想你
就當作祕密
我好想你
好想你
就深藏在心

這裏寫圖片描述
陪伴是最長情的告白 相守是最溫暖的承諾 等待是最青澀的戀情 微笑是最美好的回憶 寬容是最真是的愛情

發佈了76 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章