#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,{34,16}},29}, {{33,{48,17}},52}, {{35,{95,16}},446}, {{35,{95,15}},367}, {{35,{595,15}},14}, {{35,{92,16}},397}, {{35,{595,16}},15}, {{35,{95,17}},486}, {{35,{126,17}},18}, {{35,{595,17}},100}, {{35,{95,18}},457}, }; printf("%d\n",m[{N,{M,T}}]); return 0; } int R=INF; sort(v.begin(),v.end()); vectorunused; int c=0; for(auto &e:v){ for(;c!=e;c++)unused.push_back(c); c++; } for(;c!=N;c++)unused.push_back(c); int l=unused.size(); for(int i=0;i<1< nodes(v); for(int j=0;j mapping; for(auto &e:nodes)mapping.emplace(e,mapping.size()); int edges=0,r=0; for(auto &e:nodes)for(auto &f:m[e])if(mapping.find(f.first)!=mapping.end()){ a[edges]=mapping[e]; b[edges]=mapping[f.first]; node[edges].first=f.second; node[edges].second=edges; edges++; } sort(node,node+edges); for(int i=0;i