「UVA10766」Organising the Organisation(生成树计数)

BUPT 2017 Summer Training (for 16) #6C

题意

n个点,完全图减去m条边,求生成树个数。

题解

注意可能会给重边。
然后就是生成树计数了。

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 101
#define eps (1e-8)
#define mem(x,v) memset(x,v,sizeof(x))
typedef long long ll;
using namespace std;
int n,m,k;
ll g[N][N];
int sgn(double x){
	return x>eps?1:(x<-eps?-1:0);
}

ll det(int n){
	int i,j,k;
	ll ans=1,t;
	for(i=0;i<n;++i){
		for(j=i+1;j<n;++j)
			while(g[j][i]){
				t=g[i][i]/g[j][i];
				for(k=i;k<n;++k)
					g[i][k]-=g[j][k]*t;
				swap(g[i],g[j]);
				ans=-ans;
			}
		if(g[i][i]==0)return 0L;
		ans=ans*g[i][i];
	}
	return ans;
}

int main(){
	while(~scanf("%d%d%d",&n,&m,&k)){
		mem(g,-1);
		for(int i=0;i<n;++i)
			g[i][i]=0;
 
		for(int i=0;i<m;++i){
			int u,v;
			scanf("%d%d",&u,&v);
			--u;--v;//!!!
			g[u][v]=g[v][u]=0;
		}
		for(int i=0;i<n;++i)
			for(int j=i+1;j<n;++j){
				if(g[i][j]){
					++g[i][i];
					++g[j][j];
				}
			}
		printf("%lld\n",det(n-1));
	}
	return 0;
}
posted @ 2017-07-28 20:55  水郁  阅读(264)  评论(0编辑  收藏  举报
……