SPOJ 104 Highways(最小生成树计数)

题目链接:http://www.spoj.pl/problems/HIGH/

题意:求最小生成树个数。

思路:模板。。。

 #include <iostream>

 #include <cstdio>

 #include <cstring>

 #define int64 long long

 using namespace std;

 

 

 int n,m;

 int64 a[15][15],g[15][15];

 

 

 int64 DET(int64 a[][15],int n)

 {

     int i,j,k;

     int64 temp=1,t;

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

     {

         for(j=i+1;j<n;j++) while(a[j][i])

         {

             t=a[i][i]/a[j][i];

             for(k=i;k<n;k++)

             {

                 a[i][k]-=a[j][k]*t;

             }

             for(k=i;k<n;k++)

             {

                 t=a[i][k];

                 a[i][k]=a[j][k];

                 a[j][k]=t;

             }

             temp=-temp;

         }

         temp=temp*a[i][i];

     }

     if(temp<0) temp=-temp;

     return temp;

 }

 

 int C;

 

 int main()

 {

     for(scanf("%d",&C);C--;)

     {

         scanf("%d%d",&n,&m);

         memset(a,0,sizeof(a));

         memset(g,0,sizeof(g));

         int i,j,u,v;

         while(m--)

         {

             scanf("%d%d",&u,&v);

             u--;v--;

             g[u][v]=g[v][u]=1;

         }

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

         {

             u=0;

             for(j=0;j<n;j++) if(g[i][j]) u++,a[i][j]=-1;

             a[i][i]=u;

         }

         int64 ans=DET(a,n);

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

     }

     return 0;

 }

 

你可能感兴趣的:(最小生成树)