求问 MLE 原因
  • 板块灌水区
  • 楼主XYQ_102
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/27 11:50
  • 上次更新2024/10/25 21:02:52
查看原帖
求问 MLE 原因
712337
XYQ_102楼主2024/8/27 11:50

rt

#include<bits/stdc++.h>
using namespace std;
int n,m,A[20],fa[20],dp[65536];
struct Edge
{
	int p,q,T;
	bool operator <(const Edge &x)const{
		return T<x.T;
	}
}e[300];
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
void write(int x)
{
    if(x<0)
        putchar('-'),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
    return;
}
int GetFather(int x)
{
	return x==fa[x]?x:fa[x]=GetFather(fa[x]);
}
int Kruskal(int s)
{
	int cnt=0;
	for(int i=0;i<n;++i)
		if(s>>i&1) 
			fa[i]=i,++cnt;
	int res=0;--cnt;
	for(int r1,r2,i=1;i<=m;++i)
	{
		if(!(s>>e[i].p&1) || !(s>>e[i].q&1)) 
			continue;
		if((r1=GetFather(e[i].p))==(r2=(e[i].q))) 
			continue;
		fa[r1]=r2,res+=e[i].T;
		if(!--cnt) 
			break;
	}
	return cnt ? INT_MAX : res;
}

int main()
{
	n=read(),m=read();
	for(int i=0;i<n;++i) 
		A[i]=read();
	for(int i=1;i<=m;++i) 
		e[i].p=read(),e[i].q=read(),e[i].T=read();
	sort(e+1,e+1+m);
	int lim=(1<<n)-1;
	for(int s=1;s<=lim;++s)
	{
		int sum=0;
		for(int i=0;i<n;++i) 
			if(s>>i&1) 
				sum+=A[i];
		if(sum) 
			dp[s]=INT_MAX;
		else 
			dp[s]=Kruskal(s);
	}
	for(int s1=1;s1<=lim;++s1)
	{
		if(dp[s1]==INT_MAX) 
			continue;
		for(int s2=1;s2<=lim;++s2)
		{
			if(dp[s2]==INT_MAX || s1&s2) 
				continue;
			dp[s1|s2]=min(dp[s1|s2],dp[s1]+dp[s2]);
		}
	}
	if(dp[lim]==INT_MAX) 
		puts("Impossible");
	else 
		write(dp[lim]),putchar('\n');
	return 0;
}

2024/8/27 11:50
加载中...