bzoj1016

31 篇文章 0 订阅
25 篇文章 0 订阅

从下午4点写到了8点多。。。。

就是因为把i打成了1.。。。。。。

现在已濒临崩溃的边缘。。。。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define MAX 10010
#define mod 31011
#define f father

using namespace std;

int n,m,father[MAX],cost,power[20];
int use[MAX]={0};
int cur;

struct wbysr
{
	int from,to,value;
}a[MAX];

int get_father(int x)
{
	if(father[x]==x)
		return x;
	father[x]=get_father(father[x]);
	return father[x];
}

bool cmp(wbysr a1,wbysr a2)
{
	return a1.value<a2.value;
}

void set()
{
	int now=1;
	for(int i=1;i<=m;i++)
		if(a[i].value!=a[i+1].value)
			a[i].value=now++;
		else
			a[i].value=now;
}

int calc(int x)
{
	int answer=0;
	while(x)
	{
		answer+=x&1;
		x/=2;
	}
//	printf("calc %d %d\n",x,answer);
	return answer;
}

bool Ccheck(int x,int y)
{
	printf("%d %d  ",x,y);
	int cnt;
	cnt=n;
	for(int i=1;i<=n;i++)
		father[i]=i;
	for(int i=x;a[i].value==a[x].value;i++)
	{
		if(y&1)
		{
			father[a[i].from]=get_father(a[i].from);
			father[a[i].to]=get_father(a[i].to);
			if(father[a[i].from]!=father[a[i].to])
			{
				father[father[a[i].to]]=father[a[i].from];
				cnt--;
			}
		}
		y/=2;
	}

	int now_cost=use[a[x].value]*a[x].value;
	for(int i=1;i<=m&&cnt>1;i++)
		if(a[i].value!=a[x].value)
		{
			father[a[i].from]=get_father(a[i].from);
			father[a[i].to]=get_father(a[i].to);
			if(father[a[i].from]==father[a[i].to])
				continue;
			father[father[a[i].to]]=father[a[i].from];
			cnt--;
			now_cost+=a[i].value;
			if(cnt==1)
				break;
		}
	printf("%d check\n",(cnt==1&&now_cost==cost));
	return (cnt==1&&now_cost==cost);
}


#define edge a
#define find get_father
#define w value
#define b to
bool check(int x,int sit){
//	printf("%d %d ",x,sit);
	int res;
	int cnt;
    cnt=n;res=edge[x].w*use[edge[x].w];
    for (int i=1;i<=n;i++)   f[i]=i;
    for (int i=x;edge[i].w==edge[x].w;i++){
        if  (sit&1){
            f[edge[i].from]=find(edge[i].from);
            f[edge[i].b]=find(edge[i].b);
            if  (f[edge[i].from]!=f[edge[i].b]){
                f[f[edge[i].b]]=f[edge[i].from];
                --cnt;
            }
        }
        sit/=2;
    }
    for (int i=1;i<=m && cnt>1;i++){
        if  (edge[i].w==edge[x].w)  continue;
        f[edge[i].from]=find(edge[i].from);
        f[edge[i].b]=find(edge[i].b);
        if  (f[edge[i].from]==f[edge[i].b])    continue;
        f[f[edge[i].b]]=f[edge[i].from];
        res+=edge[i].w;
        if  (--cnt==1)  break;
    }
	int minnum=cost;
//	printf("%d \n",cur==1&&res==minnum);
    return  (cnt==1 && res==minnum);
}


int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
		scanf("%d%d%d",&a[i].from,&a[i].to,&a[i].value);
	sort(a+1,a+1+m,cmp);
	set();
	int cnt=n;
	cost=0;
	for(int i=1;i<=n;i++)
		father[i]=i;
	for(int i=1;i<=m&&cnt>1;i++)
	{
//		printf("%d %d\n",i,cost);
		father[a[i].from]=get_father(a[i].from);
		father[a[i].to]=get_father(a[i].to);
//		printf("get %d %d\n",father[a[i].from],father[a[i].to]);
		if(father[a[i].from]==father[a[i].to])
			continue;
		father[father[a[i].to]]=father[a[i].from];
		use[a[i].value]++;
		cost+=a[i].value;
		if(--cnt==1)
			break;
	}

	if(cnt!=1)
	{
		printf("0\n");
		return 0;
	}
	power[0]=1;
	for(int i=1;i<=10;i++)
		power[i]=power[i-1]*2;
	int ans=1;
	for(int i=1;i<=m;)
	{
		int j=i+1;
		while(a[j].value==a[i].value)
			j++;
		if(use[a[i].value])
		{
			cur=0;
			for(int k=0;k<power[j-i];k++)
				if((calc(k)==use[a[i].value])&&check(i,k))
					cur++;
			ans=ans*cur%mod;
//		printf("%d %d %d\n",i,j,cur);
		}
		i=j;
	}
	printf("%d\n",ans);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值