为什么95啊?
查看原帖
为什么95啊?
124676
JimmyFlower楼主2025/1/17 15:51

acwing上能过,这里Wa了第4个点,代码如下

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ri int
using namespace std;
typedef long long ll;
const int N=15,M=8200;
ll T,n,m,s,x,y,ans,sum,w[N],a[N][N],f[M][N][N],g[M][N][N];
void solve()
{
    memset(f,-1,sizeof(f)); memset(a,0,sizeof(a)); memset(g,0,sizeof(g));
    ans=sum=s=0;
    scanf("%lld %lld",&n,&m);
    for(ri i=0;i<=n-1;i++) scanf("%lld",&w[i]),s+=w[i];
    for(ri i=1;i<=m;i++)
    {
        scanf("%lld %lld",&x,&y); x--,y--;
        a[x][y]=a[y][x]=1;
    }
    for(ri i=0;i<=n-1;i++) f[1<<i][i][i]=0,g[1<<i][i][i]=1;
    for(ri i=0;i<=(1<<n)-1;i++)
        for(ri j=0;j<=n-1;j++)
            for(ri k=0;k<=n-1;k++) if(((i>>j)&1)&&((i>>k)&1)&&f[i][j][k]!=-1)
                for(ri p=0;p<=n-1;p++) if((!((i>>p)&1))&&a[k][p])
                {
                    ll res=f[i][j][k]+w[k]*w[p];
                    if(a[j][p]&&a[j][k]) res+=w[j]*w[k]*w[p];
                    if(res>f[i|(1<<p)][k][p]) f[i|(1<<p)][k][p]=res,g[i|(1<<p)][k][p]=g[i][j][k];
                    else if(res==f[i|(1<<p)][k][p]) g[i|(1<<p)][k][p]+=g[i][j][k];
                }
    for(ri i=0;i<=n-1;i++)
        for(ri j=0;j<=n-1;j++)
            if(f[(1<<n)-1][i][j]>ans)
                ans=f[(1<<n)-1][i][j];
    for(ri i=0;i<=n-1;i++)
        for(ri j=0;j<=n-1;j++)
            if(f[(1<<n)-1][i][j]==ans)
                sum+=g[(1<<n)-1][i][j];
    if(ans&&sum) printf("%lld %lld\n",ans+s,sum/2);
    else printf("0 0\n");
}
int main()
{
    scanf("%lld",&T);
    while(T--) solve();
    return 0;
}
2025/1/17 15:51
加载中...