先做一遍kruskal,然后发现不同的方案只可能是相同权值的不同的边干了相同的事
题目又保证了相同权值的边数很少,直接状压即可
1 #include2 #include 3 #include 4 #include 5 #include 6 #define N 1005 7 using namespace std; 8 int getnum(int x){ 9 int cnt=0;10 while(x){cnt+=x&1;x>>=1;}11 return cnt;12 }13 int n,m,ans=1;14 int fa[N],tmp[N];15 int find(int x,int *y){16 if(x==y[x])return x;17 return y[x]=find(y[x],y);18 }19 struct edge{ int u,v,w;}ed[10*N];20 bool cmp(edge a,edge b){ return a.w =be&&i<=en)continue;44 if(vis[i]){45 int fu=find(ed[i].u,tmp),fv=find(ed[i].v,tmp);46 tmp[fu]=fv;num--;47 }48 }49 len=en-be+1;50 for(int i=0;i