hdu 4408 最小生成樹計數

2021-06-14 01:29:13 字數 1482 閱讀 7587

經典題了

#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define clr(a,v) memset(a,v,sizeof(a))

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

const int inf = 0x7f7f7f7f;

const int maxn = 211;

const double pi = acos(-1.0);

const double eps = 1e-10;

typedef long long ll;

typedef pairpii;

typedef vectorvi;

typedef vectorvvi;

typedef vectorvvvi;

typedef pairpii;

int deg[maxn][maxn];

ll det[maxn][maxn];

int g[maxn][maxn];

int n, m, p, mod;

vector::iterator it;

int f[maxn], g[maxn];

int find(int n, int f)

bool vis[maxn];

ll det(int n)

ans *= -1;}}

if (!det[i][i])

return 0;

}for (i = 0; i < n; ++i)

ans = (ans % mod + mod) % mod;

return ans;

}int main()

if (!m)

int sz;

ll ans = 1;

memset(vis, false, sizeof(vis));

for (i = 1; i <= 10; ++i)

for (j = 0; j < n; ++j)

for (j = 0; j < n; ++j)

}ll t = det(sz - 1);

ans = ans * t % mod;}}

for (j = 0; j < n; ++j)

f[j] = g[j] = find(j, g), gra[j].clear();

}bool flag = true;

for (i = 1; i < n && flag; ++i)

}if (!flag)

ans = 0;

printf("%i64d\n", ans);

}return 0;

}

hdu 1863 最小生成樹

使用並查集,陣列不要太小 include stdio.h int set 200 int n,m typedef struct nodenode,pnode node road 200 void init int find int u return set u int join int u,int ...

hdu 4081 最小生成樹

先求出最小生成樹,然後列舉樹上的邊,對於每條邊 分別 找出這條割邊形成的兩個塊中點權最大的兩個 1.由於結果是a b,a的變化會引起b的變化,兩個制約,無法直接貪心出最大的a b,故要通過列舉 2.不管magic road要加在 加的邊是否是最小生成樹上的邊,都會產生環,我們都要選擇一條邊刪掉 注意...

hdu 1863(最小生成樹)

基礎的最小生成樹問題,不過 要特判條件不足的情況 include include define inf 1 30 int n,m,vis 110 low 110 int map 110 110 int init int prim if pos 1 return 1 代表這當前步驟缺少條件 int k...