求大佬,光枚举就有问题了..
#include<bits/stdc++.h>
using namespace std;
#define Maxn 100010
int n,m,u1,v1,jd1[2010],jd[2020],tot,head[2010];
inline int read()
{
int x=0;char s=getchar();
while(!isdigit(s))s=getchar();
while(isdigit(s))x=(x<<1)+(x<<3)+(s^48),s=getchar();
return x;
}
struct edge{int to,w,nxt;
}e[Maxn<<1];
inline void addedge(int u,int v){
e[++tot]=(edge){v,head[u]};head[u]=tot;
}
long long ans=0,anss=2147483647,zht[10]={0,1,2,3,4,5,6,7,8,9},bia[10],bib[10];
int main()
{
n=read();
//m=read();
for(int i=1;i<=n;i++)jd[i]=read();
for(int i=1;i<=n;i++)jd1[jd[i]]=i;
for(int i=1;i<=n;i++)cout<<jd1[i];//每个节点上的数
for(int i=1;i<=n-1;i++)u1=read(),v1=read(),bia[i]=u1,bib[i]=v1,addedge(u1,v1),addedge(v1,u1);
if(n<=10){
//for(int i=1;i<=n-1;i++)e.to,bib[i]=e.u1=read(),v1=read(),addedge(u1,v1),addedge(v1,u1);
do
{//cout<<1;
for(int i=1;i<=n;i++)
jd[i]=jd1[i];
for(int i=1;i<n;i++)
{
swap(jd[bia[zht[i]]],jd[bib[zht[i]]]);//交换两边上的数
for(int i=1;i<=n;i++)
cout<<i<<":"<<jd[i]<<" ";
cout<<endl;
}
for(int i=1;i<=n;i++)
ans=ans*10+(jd[i]-1);//状压 1-10换成0-9
anss=min(ans,anss);
for(int i=1;i<n;i++)
cout<<zht[i]<<" ";
cout<<endl;
for(int i=1;i<=n;i++)
cout<<jd[i]<<" ";
cout<<endl;
//5*4*3*2*1=120
/*for(int i=n-1;i>=0;i--)
swap(jd[bia[zht[i]]],jd[bib[zht[i]]]);
*/
cout<<ans<<endl;
ans=0;
}while(next_permutation(zht+1,zht+n));
cout<<anss;
//还原还没有写
}
return 0;
}
/*
5
2 1 3 5 4
1 3
1 4
2 4
4 5
*/