kuangbin專題八 URAL1627 Join(生成樹計數)
題意:
給出一個圖,’.’表示臥室,’*’表示儲藏間,每個格子上下左右都有一堵牆,然後需要打通一些臥室的牆(只能是相鄰房間才能打通)使得臥室之間聯通的方案數.
給每個臥室編個號,給可以打通的臥室加邊,就是裸的生成樹計數了.
題解:
打通一些臥室的牆之後,臥室之間就會變成一棵樹,那麼我們只要計算生成樹的方案數就好了,怎麼做呢,給每個臥室編個號,然後就是計算他們的聯通邊,寫出鄰接矩陣,然後弄個生成樹計算模板就可以算出來結果了。
題外話:
ORZ,晚上和第二天早上一直超時和WA就是不知道為什麼錯誤了,看了幾個部落格我看了都是差不多的啊,為什麼超時了,為什麼錯了,最後改者改著發現了很多小問題,比如為什麼超時呢?這道題的超時可能是因為你沒弄long long int ,還有就是你的點數問題,不能只是10*10的矩陣,應該是100*100的矩陣,因為你原本的圖最多可以有81個’.’也就是說最多有81個點,那麼你如何是10*10的矩陣就算不出結果了,導致各種錯誤,還有最倒黴的就是我TM之前用的模板是錯的!麻痺只能過一些題,還好做的這道題讓我知道我的模板是錯誤的,不然就TM尷尬了。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define LL long long int
const int MAXN=111;
const LL mod=1e9;
char s[MAXN][MAXN];
int map[MAXN][MAXN];
LL B[MAXN][MAXN];
int g[4][2]={1,0,-1,0,0,1,0,-1};
int id[MAXN][MAXN];
int tol;
LL determinant(int n)
{
LL res=1;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
while(B[j][i])
{
LL t=B[i][i]/B[j][i];
for(int k=i;k<n;k++)
{
B[i][k]=(B[i][k]-B[j][k]*t%mod+mod)%mod;
swap(B[i][k],B[j][k]);
}
res=-res;
}
}
if (!B[i][i]) return 0;
res=res*B[i][i]%mod;
}
return (res+mod)%mod;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
tol=0;
memset(id,0,sizeof(id));
memset(B,0,sizeof(B));
for(int i=0;i<n;i++)
{
scanf("%s",&s[i]);
for(int j=0;j<m;j++)
if(s[i][j]=='.')
id[i][j]=tol++;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(s[i][j]=='.')
for(int k=0;k<4;k++)
{
int x=i+g[k][0];
int y=j+g[k][1];
if(x<0||x>=n||y<0||y>=m||s[x][y]=='*')
continue;
B[id[i][j]][id[i][j]]++;
B[id[i][j]][id[x][y]]=-1;
}
}
}
tol=tol-1;
LL ans=determinant(tol);
printf("%lld\n",ans);
}
}
相關推薦
kuangbin專題八 URAL1627 Join(生成樹計數)
題意: 給出一個圖,’.’表示臥室,’*’表示儲藏間,每個格子上下左右都有一堵牆,然後需要打通一些臥室的牆(只能是相鄰房間才能打通)使得臥室之間聯通的方案數. 給每個臥室編個號,給可以打通的臥室加邊,就是裸的生成樹計數了. 題解: 打通一
kuangbin專題八 UVA10766 (生成樹計數)Organising the Organisation(請無視這篇文章)
題意: 給出n,m,k,代表一家公司有n個部門,編號1到n,有m組關係,表示i和j不能直接聯通,k代表主管部門,問你有多少種分層方案。另外,這道題的k可以忽略掉,所以他的範圍完全是嚇唬人的。 題解: 抱歉,這道題我真的無法弄的通俗的說出來
STP(生成樹協議)--學習筆記
STP(生成樹協議)--學習筆記一·STP STP協議在邏輯上斷開網絡的環路,防止廣播風暴的產生,而一旦正在使用的線路出現故障,邏輯上被斷開的線路又被連同,起到了冗余備份的作用。解決二層環路的問題。 二·生成樹工作原理 生成樹協議的算法過程可以歸納為三個步驟:選擇根網橋、選擇根端口、選擇指定端口。 (1)選
UVA 10766 Organising the Organisation(生成樹計數 不取模)
Problem H Organising the Organisation Input: Standard Input Output: Standard Output Time Limit: 2 Second I am the chief of the Personne
CISCO交換機STP實驗(生成樹協議)
目錄 一、前言:生成樹協議(STP) 二、CISCO交換機STP命令彙總 三、運用STP搭建簡單拓撲 四、實戰:STP綜合實驗 五、結語 一、前言:生成樹協議(STP) 計算機網路中,我們為了減少網路故障導致無法正常通訊的問題,通常會增加冗餘裝置作為備用,形成冗餘拓撲。但是也增加了冗餘鏈路,這樣
kuangbin專題八生成樹總結
總結:生成樹的知識點真多,不過博主覺得圖論的題目終究是建圖難,第一步就是如何建圖,將其轉換成已知的問題。 另外,關於生成樹的兩個注意點,也是為了防止碰到毒瘤題。一就是自環,二就是重邊。 A - The Unique MST 次小生成樹裸題。 prim模板
貨車運輸(最大生成樹+LCA)
整數 fine std 一個 ext getchar() 最小路徑 ont getch 題目描述 A 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物, 司機們想知道每輛車在不超過車輛限重
Gym-101630C:Connections(生成樹&構造)
int conn namespace std size long long 生成 class ons 題意:給定N點,M條有向邊,滿足任意點可以到達任意點。現在叫你保留2*N邊,任然滿足任意點可以到達任意點,輸出刪除的邊。 思路:從1出發,DFS,得到一顆生成樹,有N-1
BZOJ1494: [NOI2007]生成樹計數(Berlekamp-Massey演算法)
傳送門 題解: 直接打表+BM算出遞推式,BM具體實現可以戳這裡 附上一份其醜無比的BM程式碼: const int L=4e2; namespace bm { int cnt,a[N],fail[N],delta[N]; vector <int> R[N]
Qin Shi Huang's National Road System 【HDU - 4081】【次優比例生成樹(最優比例生成樹變形)】
題目連結 題目問的是有N個點集,問你建立N-1條邊的情況下,使得路徑最短的方案數,但是呢,題目中又給出徐福會魔法可以把一條路徑變成免費道路,但是有個限制就是希望這條路上兩個城市的人口數比上除去該路徑以外整棵樹的權值能最大。 一開始就想到的是最優比例生成樹,但是
計蒜客:灌溉(生成樹)
https://nanti.jisuanke.com/t/34 到了旱季農業生產的灌溉就成了一個大問題。為了保證灌溉的順利,某縣政府決定投資為各個村之間建立灌溉管道。 輸入第1行包括一個整數N,表示某縣的村莊的數量。(3≤N≤100),第2行-結尾為一個N×N的矩陣,表示每個村莊之間的距
1627 Join 生成樹計數模板題
URAL - 1627 Join Businessman Petya recently bought a
網橋(生成樹網橋和源路由網橋)
生成樹網橋: 網橋收到一個數據幀以後,執行地址表擴充和幀轉發,地址表擴充是指檢視信源結點地址,進行地址表的擴充,從而使網橋瞭解哪些節點在哪些子網中;幀轉發是指如果本地址表有信源地址裡所有的結點,則直接進行轉發;如果沒有,則傳送給本網橋所連線的所有子網(廣播) 此種方法得以
【NOIP 2013 Day1 T3】貨車運輸(最大生成樹+LCA)
題目描述 Description A 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。
資料結構——圖的連通性(生成樹、最小生成樹、生成森林)
1、求圖的生成樹(或生成森林) 生成樹:是一個極小連通子圖,它含有圖中全部n個頂點,但只有n-1條邊。 生成森林: 由若干棵生成樹組成,含全部頂點,但構成這些樹的邊是最少的。
AtCoder Regular Contest 093 E: Bichrome Spanning Tree(生成樹)
包含 bool font return continue 找到 col include 情況下 Bichrome Spanning Tree 題意: 給出一個n個點,m條邊的無向連通圖,現在要給每條邊染色,可以染成黑色或者白色。 現在要求在染色完畢後,找出一個至少包含
hdu4305Lightning 生成樹計數(基爾霍夫矩陣)+高斯消元+逆元
題意:比較裸的生成樹計數問題。 如何處理生成樹計數問題? 基爾霍夫矩陣: if i==j Kir[i][j] = i的度數 if i!=j Kir[i][j] = i到j的平行邊的個數的負數 即,基爾霍夫矩陣 = 度數矩陣 - 鄰接矩陣 將基爾霍夫矩陣刪去第i
生成樹計數(Matrix-Tree定理)
以下轉載自http://blog.csdn.net/jarily/article/details/8901363 /* *演算法引入: *給定一個無向圖G,求它生成樹的個數t(G); * *演算法思想: *(1)G的度數矩陣D[G]是一個n*n的矩陣,並且滿足:
資料結構學習筆記(20)---圖的應用(生成樹與最小生成樹)
上一篇部落格寫了圖的基本儲存於遍歷,在此基礎上,此篇部落格將會介紹圖的主要應用—–生成樹與最小生成樹。 (一)生成樹 定義:我總感覺書上定義比較繁瑣,因此就自己簡單定義了一下(可能不對哦),生成樹其實就是:對於一棵樹G,若頂點數為n,則在原來圖的基礎上把
【BZOJ1494】【NOI2007】生成樹計數(動態規劃,矩陣快速冪)
題面 Description 最近,小棟在無向連通圖的生成樹個數計算方面有了驚人的進展,他發現: ·n個結點的環的生成樹個數為n。 ·n個結點的完全圖的生成樹個數為n^(n-2)。這兩個發現讓小棟欣喜若狂,由此更加堅定了他繼續計算生成樹個數的 想法,他