本文共 1282 字,大约阅读时间需要 4 分钟。
题意:
给出n, m, k。表示n个点,其中m条边不能直接连通,求生成树个数。
思路:
这也算个裸题,把可以连接的边连接起来,然后矩阵树计算一下即可。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 using namespace std;13 typedef long long ll;14 typedef pair pll;15 const int INF = 0x3f3f3f3f;16 const int maxn=60+5;17 18 int n,m,root;19 int unable[maxn][maxn];20 long double C[maxn][maxn];21 22 long double Gauss()23 {24 for(int k=1; k<=n; k++) //k表示当前行数,因为行数与列数一样,所以这里k也代表了列数25 {26 int max_r=k;27 for(int i=k+1;i<=n;i++)28 if(fabs(C[i][k])>fabs(C[max_r][k])) max_r=i;29 if(C[max_r][k]==0) return 0; //有一列为0,行列式的值必为030 if(max_r!=k)31 {32 for(int j=k;j<=n;j++)33 swap(C[k][j],C[max_r][j]);34 }35 for(int i=k+1;i<=n;i++)36 {37 long double tmp=C[i][k]/C[k][k];38 for(int j=k;j<=n;j++)39 C[i][j]-=tmp*C[k][j];40 }41 }42 long double ans=1;43 for(int i=1;i<=n;i++) ans*=C[i][i]; //化为三角阵后计算主对角线元素乘积44 ans=fabs(ans);45 return ans;46 }47 48 int main()49 {50 //freopen("in.txt","r",stdin);51 while(~scanf("%d%d%d",&n,&m,&root))52 {53 memset(unable,0,sizeof(unable));54 memset(C,0,sizeof(C));55 for(int i=0;i
转载于:https://www.cnblogs.com/zyb993963526/p/7356597.html