這個題仔細一看就是生成樹計數,但是我這個記性是真的差,早就忘了。複習了一下高斯消元,然後這個題就是很裸的題了。
ps:高斯消元解行列式的時候要取反。
題幹:
題目背景當今社會,在社交網路上看朋友的訊息已經成為許多人生活的一部分。通常,乙個使用者在社交網路上發布一條訊息(例如微博、狀態、tweet等) 後,他的好友們也可以看見這條訊息,並可能**。**的訊息還可以繼續被人**,進而擴散到整個社交網路中。
題目描述
在乙個實驗性的小規模社交網路中我們發現,有時一條熱門訊息最終會被所有人**。為了研究這一現象發生的過程,我們希望計算一條訊息所有可能的**途徑有多少種。為了程式設計方便,我們將初始訊息傳送者編號為1,其他使用者編號依次遞增。
該社交網路上的所有好友關係是已知的,也就是說對於a、b 兩個使用者,我們知道a 使用者可以看到b 使用者傳送的訊息。注意可能存在單向的好友關係,即la 能看到b 的訊息,但b 不能看到a 的訊息。
還有乙個假設是,如果某使用者看到他的多個好友**了同一條訊息,他只會選擇從其中乙個**,最多**一次訊息。從不同好友的**,被視為不同的情況。
如果用箭頭表示好友關係,下圖展示了某個社交網路中訊息**的所有可能情況。 (初始訊息是使用者1傳送的,加粗箭頭表示一次訊息**)
輸入輸出格式
輸入格式:
輸入檔案第一行,為乙個正整數n,表示社交網路中的使用者數; 第二行為乙個正整數m,表示社交網路中的好友關係數目。
接下來m 行,每行為兩個空格分隔的整數aia_iai和bib_ibi,表示一組好友關係,即使用者aia_iai 可以看到使用者bib_ibi 傳送的訊息。
輸出格式:
輸出檔案共一行,為一條訊息所有可能的**途徑的數量, 除以10007 所得的餘數。
**:
#include#include#include
#include
#include
#include
#include
using
namespace
std;
#define duke(i,a,n) for(register int i = a;i <= n;++i)
#define lv(i,a,n) for(register int i = a;i >= n;--i)
#define clean(a) memset(a,0,sizeof(a))
const
int inf = 1
<< 30
;typedef
long
long
ll;typedef
double
db;template
void read(t &x)
template
void
write(t x)
const
int mod = 1e4 + 7
;int
n,m;
int f[255][255
];int
gauss()
swap(f[i],f[j]);
ans = -ans;}}
if(f[i][i] == 0) return0;
ans = (ans * f[i][i]) %mod;
}return (ans + mod) %mod;
}int
main()
duke(i,
1,n)
}printf(
"%d\n
",gauss() %mod);
return0;
}
CQOI2018 社交網路
當今社會,在社交網路上看朋友的訊息已經成為許多人生活的一部分。通常,乙個使用者在社交網路上發布一條訊息 例如微博 狀態 tweet等 後,他的好友們也可以看見這條訊息,並可能 的訊息還可以繼續被人轉 發,進而擴散到整個社交網路中。在乙個實驗性的小規模社交網路中我們發現,有時一條熱門訊息最終會被所有人...
bzoj5297 Cqoi2018 社交網路
題目描述 bz題解 有向圖矩陣樹定理裸題。與無向圖區別是,對於一條邊 u,v 在基爾霍夫矩陣中令 a v v a u v 同時以 k 為根時要扔掉第 k 行第 k 列。include include include include using namespace std typedef long l...
BZOJ5297 CQOI2018 社交網路
考前掙扎 有向圖生成樹 我們知道對於無向圖生成樹可以通過矩陣樹定理來算具體就是 度數矩陣 鄰接矩陣 去掉任意一行一列得到余子式 對行列式求值 有向圖生成樹分為外向和內向兩種 外向生成樹當然是所有邊指向兒子 他的矩陣樹定理是這個樣子 對於有向邊 x,y 度數矩陣d y y 鄰接矩陣e x y 內向生成...