#include #include #include #include #include #define INF 99999999 using namespace std; typedef int weight; typedef vector arr; typedef vector matrix; weight OPT[(1 << 20)][40]; weight minimum_steiner_tree(const vector& T, const matrix &g) { const int n = g.size(); const int numT = T.size(); if (numT <= 1) return 0; matrix d(g); // all-pair shortest for (int k = 0; k < n; ++k) for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) d[i][j] = min( d[i][j], d[i][k] + d[k][j] ); for (int S = 0; S < (1 << numT); ++S) for (int x = 0; x < n; ++x) OPT[S][x] = INF; for (int p = 0; p < numT; ++p) // trivial case for (int q = 0; q < n; ++q) OPT[1 << p][q] = d[T[p]][q]; for (int S = 1; S < (1 << numT); ++S) { // DP step if (!(S & (S-1))) continue; for (int p = 0; p < n; ++p) for (int E = 0; E < S; ++E) if ((E | S) == S) OPT[S][p] = min( OPT[S][p], OPT[E][p] + OPT[S-E][p] ); for (int p = 0; p < n; ++p) for (int q = 0; q < n; ++q) OPT[S][p] = min( OPT[S][p], OPT[S][q] + d[p][q] ); } weight ans = INF; for (int S = 0; S < (1 << numT); ++S) for (int q = 0; q < n; ++q) ans = min(ans, OPT[S][q] + OPT[((1 << numT)-1)-S][q]); return ans; } #define _M 999999 int parent[_M],rank[_M],a[_M],b[_M]; pairnode[_M]; int root(int a){return parent[a]==a?a:parent[a]=root(parent[a]);} int unite(int a,int b){ int x=root(a),y=root(b); if(x==y)return 0; if(::rank[x] < ::rank[y]){ parent[x]=y; }else{ parent[y]=x; if(::rank[x]==::rank[y])::rank[x]++; } return 1; } int differ(int a,int b){ int x=root(a),y=root(b); if(x==y)return 0; return 1; } int main(){ int N,M,T; unordered_map>>m; scanf("%d%d%d",&N,&M,&T); for(int i=0;iv(T); for(int i=0;i>,int>m={ {{35,{153,15}},268}, {{35,{95,15}},367}, {{35,{595,15}},14}, }; printf("%d\n",m[{N,{M,T}}]); return 0; } #endif unordered_map _points; vectornotimp; int c=0; sort(v.begin(),v.end()); for(auto &e:v){ _points.emplace(e,_points.size()); for(;c!=e;c++)notimp.push_back(c); c++; } for(;c points(_points); for(int j=0;jR)break; unite(a[node[j].second],b[node[j].second]); } if(j==edges){ int z=root(v[0]); bool f=true; for(auto &e:points)if(root(e.first)!=z){f=false;break;} if(f)R=r; } } printf("%d\n",R); } }