解题报告 树形图计数
1.????????題目
樹(shù)形圖計(jì)數(shù)
count.pas/c/cpp
?
【問(wèn)題描述】
小k同學(xué)最近正在研究最小樹(shù)形圖問(wèn)題。所謂樹(shù)形圖,是指有向圖的一棵有根的生成樹(shù),其中樹(shù)的每一條邊的指向恰好都是從根指向葉結(jié)點(diǎn)的方向?,F(xiàn)在小k在紙上畫(huà)了一個(gè)圖,他想讓你幫忙數(shù)一下這個(gè)圖有多少棵樹(shù)形圖。
?
【輸入格式】
第1行輸入1個(gè)正整數(shù):n,表示圖中點(diǎn)的個(gè)數(shù)
第2~n+1行每行輸入n個(gè)字符,描述了這個(gè)圖的鄰接矩陣。第i+1行第j個(gè)字符如果是0則表示沒(méi)有從i連向j的有向邊,1表示有一條從i到j的有向邊。
?
【輸出格式】
輸出1行1個(gè)整數(shù),表示這個(gè)有向圖的樹(shù)形圖個(gè)數(shù)。
?
【樣例輸入】
count.in
4
0100
0010
0001
1000
?
【樣例輸出】
count.out
4
?
【數(shù)據(jù)規(guī)模和約定】
對(duì)于100%的數(shù)據(jù),n<=8?.
2.????????算法
以每一個(gè)節(jié)點(diǎn)為根,判斷從這個(gè)根開(kāi)始用有向邊能不能找到所有節(jié)點(diǎn),如果能則記錄。
?
判斷方法:首先將這棵樹(shù)構(gòu)建出來(lái),也就是輪流將該點(diǎn)的入度所連的點(diǎn)作為他的父親節(jié)點(diǎn),看可不可以將這棵樹(shù)構(gòu)建出來(lái),如果可以,再看構(gòu)建出來(lái)的樹(shù)能不能找到所有節(jié)點(diǎn)。
3.????????注意事項(xiàng)
要先將這棵樹(shù)構(gòu)建出來(lái),再判斷。
4.????????代碼
深搜+判斷(ASDF)
program?asdf;
??var
????b,a:array[0..10,0..10]of?longint;
????f,ff:array[0..10]of?boolean;
????fa:array[0..10]of?longint;
????n,i,j,k,root:longint;
????all,sum,ans:qword;
????flag:boolean;
????ch:char;
??function?judge:boolean;
????var
??????i,x:longint;
????begin
??????fillchar(f,sizeof(f),false);
??????f[root]:=true;
??????for?i:=1?to?n?do
????????begin
??????????fillchar(ff,sizeof(ff),false);
??????????x:=fa[i];
??????????while?(fa[x]<>root)and(not?f[fa[x]])and(fa[x]<>0)?do
????????????begin
??????????????if?ff[x]?then?exit(false);
??????????????ff[x]:=true;
??????????????x:=fa[x];
????????????end;
??????????if?fa[x]=0?then?exit(false);
??????????if?(fa[x]=root)or(f[fa[x]])?then
????????????begin
??????????????x:=i;
??????????????while?not?f[x]?do
????????????????begin
??????????????????f[x]:=true;
??????????????????x:=fa[x];
????????????????end;
????????????end;
????????end;
??????exit(true);
????end;
??procedure?dfs(x:longint);
????var
??????i:longint;
????begin
??????if?x=root?then
????????begin
??????????dfs(x+1);
??????????exit;
????????end;
??????if?x=n+1?then
????????begin
??????????if?judge?then?inc(ans);
??????????exit;
????????end;
??????for?i:=1?to?n?do
????????if?b[i,x]<>0?then
??????????begin
????????????fa[x]:=i;
????????????dfs(x+1);
??????????end;
????end;
??begin
????assign(input,'count.in');reset(input);
????assign(output,'count.out');rewrite(output);
????readln(n);
????for?i:=1?to?n?do
??????begin
????????for?j:=1?to?n?do
??????????begin
????????????read(ch);
????????????if?ch='1'?then?b[i,j]:=1
????????????else?b[i,j]:=0;
??????????end;
????????readln;
??????end;
????for?root:=1?to?n?do
??????begin
????????flag:=false;
????????for?i:=1?to?n?do
??????????if?b[root,i]<>0?then
????????????begin
??????????????flag:=true;
??????????????break;
????????????end;
????????fa[root]:=root;
????????if?flag?then
??????????dfs(1);
??????end;
????write(ans);
????close(input);
????close(output);?
??end.
?
轉(zhuǎn)載于:https://www.cnblogs.com/SueMiller/archive/2011/10/15/2213100.html
總結(jié)
以上是生活随笔為你收集整理的解题报告 树形图计数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Nginx指南
- 下一篇: 商女不知亡国恨,一天到晚敲代码