看别人写的才学会的。。。

我们考虑刚开始的一个点, 然后我们枚举接上去的一条一条链,

dp[mask]表示当前已经加进去点的状态是mask所需的最少边数。

反正就是很麻烦的一道题, 让我自己写我是写不出来的。。。 我好菜啊。

#include<bits/stdc++.h>
#define LL long long
#define LD long double
#define ull unsigned long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ALL(x) (x).begin(), (x).end() using namespace std; const int N = 1e6 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e6 + ;
const int p = 1e6 + ;
const double eps = 1e-;
const double PI = acos(-); template<class T, class S> inline void add(T& a, S b) {a += b; if(a >= mod) a -= mod;}
template<class T, class S> inline void sub(T& a, S b) {a -= b; if(a < ) a += mod;}
template<class T, class S> inline bool chkmax(T& a, S b) {return a < b ? a = b, true : false;}
template<class T, class S> inline bool chkmin(T& a, S b) {return a > b ? a = b, true : false;} int n, m;
int G[][];
int vtomask[][ << ];
int dp[ << ], pre[ << ][];
vector<int> road[ << ][][];
vector<PII> ans; int main() {
memset(dp, inf, sizeof(dp));
scanf("%d%d", &n, &m);
for(int i = ; i < m; i++) {
int u, v; scanf("%d%d", &u, &v);
u--; v--;
G[u][v] = G[v][u] = ;
}
for(int i = ; i < n; i++) {
for(int mask = ; mask < ( << n); mask++) {
for(int j = ; j < n; j++) {
if(mask >> j & ) {
if(G[i][j]) vtomask[i][mask]++;
}
}
}
}
for(int i = ; i < n; i++) road[ << i][i][i].push_back(i);
for(int mask = ; mask < ( << n); mask++) {
for(int u = ; u < n; u++) {
for(int v = ; v < n; v++) {
if(!SZ(road[mask][u][v])) continue;
for(int z = ; z < n; z++) {
if(mask >> z & ) continue;
if(!G[v][z]) continue;
int nxtmask = mask | ( << z);
if(SZ(road[nxtmask][u][z])) continue;
road[nxtmask][u][z] = road[mask][u][v];
road[nxtmask][u][z].push_back(z);
}
}
}
}
dp[] = ;
for(int mask = ; mask < ( << n); mask++) {
if(dp[mask] >= inf) continue;
for(int u = ; u < n; u++) {
if(mask >> u & ) continue;
if(!vtomask[u][mask]) continue;
if(vtomask[u][mask] >= ) {
int nxtmask = mask | ( << u);
if(chkmin(dp[nxtmask], dp[mask] + )) {
pre[nxtmask][] = mask;
pre[nxtmask][] = u;
pre[nxtmask][] = -;
}
}
for(int v = u + ; v < n; v++) {
if(mask >> v & ) continue;
if(!vtomask[v][mask]) continue;
int amask = (( << n) - ) ^ mask ^ ( << u) ^ ( << v);
for(int smask = amask; ; smask = (smask - ) & amask) {
int tmask = smask | ( << u) | ( << v);
if(SZ(road[tmask][u][v])) {
if(chkmin(dp[mask | tmask], dp[mask] + SZ(road[tmask][u][v]) + )) {
pre[mask | tmask][] = mask;
pre[mask | tmask][] = u;
pre[mask | tmask][] = v;
}
}
if(!smask) break;
}
}
}
}
printf("%d\n", dp[( << n) - ]);
int mask = ( << n) - ;
while(mask != ) {
int pmask = pre[mask][];
int u = pre[mask][];
int v = pre[mask][];
if(~v) {
int tmask = mask ^ pmask;
for(int i = ; i < SZ(road[tmask][u][v]); i++)
ans.push_back(mk(road[tmask][u][v][i - ], road[tmask][u][v][i]));
for(int i = ; i < n; i++) {
if((pmask >> i & ) && G[u][i]) {
ans.push_back(mk(i, u));
break;
}
}
for(int i = ; i < n; i++) {
if((pmask >> i & ) && G[v][i]) {
ans.push_back(mk(i, v));
break;
}
}
} else {
for(int i = , c = ; c; i++) {
if(G[u][i] && (pmask >> i & )) {
ans.push_back(mk(u, i));
c--;
}
}
}
mask = pmask;
}
for(auto& t : ans) printf("%d %d\n", t.fi + , t.se + );
return ;
} /*
*/

Codeforces 1155F Delivery Oligopoly dp(看题解)的更多相关文章

  1. Codeforces 513E2 Subarray Cuts dp (看题解)

    我们肯定要一大一小间隔开来所以 把式子拆出来就是类似这样的形式 s1 - 2 * s2 + 2 * s3 + ...... + sn 然后把状态开成四个, 分别表示在顶部, 在底部, 在顶部到底部的中 ...

  2. Codeforces 750E New Year and Old Subsequence 线段树 + dp (看题解)

    New Year and Old Subsequence 第一感觉是离线之后分治求dp, 但是感觉如果要把左边的dp值和右边的dp值合起来, 感觉很麻烦而且时间复杂度不怎么对.. 然后就gun取看题解 ...

  3. Codeforces 1017F The Neutral Zone (看题解)

    这题一看就筛质数就好啦, 可是这怎么筛啊, 一看题解, 怎么会有这么骚的操作. #include<bits/stdc++.h> #define LL long long #define f ...

  4. Codeforces 865C Gotta Go Fast 二分 + 期望dp (看题解)

    第一次看到这种骚东西, 期望还能二分的啊??? 因为存在重置的操作, 所以我们再dp的过程中有环存在. 为了消除环的影响, 我们二分dp[ 0 ][ 0 ]的值, 与通过dp得出的dp[ 0 ][ 0 ...

  5. Codeforces 442D Adam and Tree dp (看题解)

    Adam and Tree 感觉非常巧妙的一题.. 如果对于一个已经建立完成的树, 那么我们可以用dp[ i ]表示染完 i 这棵子树, 并给从fa[ i ] -> i的条边也染色的最少颜色数. ...

  6. Codeforces 1101F Trucks and Cities dp (看题解)

    Trucks and Cities 一个很显然的做法就是二分然后对于每个车贪心取check, 这肯定会TLE, 感觉会给人一种贪心去写的误导... 感觉有这个误导之后很难往dp那个方向靠.. dp[ ...

  7. Codeforces 596D Wilbur and Trees dp (看题解)

    一直在考虑, 每一段的贡献, 没想到这个东西能直接dp..因为所有的h都是一样的. #include<bits/stdc++.h> #define LL long long #define ...

  8. Codeforces 983C Elevator dp (看题解)

    Elevator 怎么今天写啥题都不会写啊, 我是傻了吗.. 把电梯里面四个人的目标点当作状态, 然后暴力转移. #include<bits/stdc++.h> #define LL lo ...

  9. Codeforces 744C Hongcow Buys a Deck of Cards 状压dp (看题解)

    Hongcow Buys a Deck of Cards 啊啊啊, 为什么我连这种垃圾dp都写不出来.. 不是应该10分钟就该秒掉的题吗.. 从dp想到暴力然后gg, 没有想到把省下的红色开成一维. ...

随机推荐

  1. 关于vue-router 中参数传递的那些坑(params,query)

    1.query方式传参和接受参数 传参 this.$router.push({ path:'/xxx' query:{ idname:id } })接收的方式:this.$route.query.id ...

  2. spring AOP的概念和使用

    指路:http://www.cnblogs.com/liujiayun/p/5912628.html AOP的来源:OOP在一些重复代码的使用中,代码冗余比较多,利用AOP可以改善. 通过编写切面和切 ...

  3. 同样级别iOS程序员,为啥比我菜的程序员薪资都比我高?

    前言: 作为程序员,都有一种相同的焦虑——即当一次又一次的新技术浪潮袭来,总会不由自主的拼命跟随,总是担心如果不紧跟新技术的潮流,将会被时代所抛弃. 害怕年龄,害怕平庸,其实只是你在现实里的努力无法支 ...

  4. react项目后台及上线步骤

    应同学要求,本人将react项目创建后台及上线流程书写如下: 前端部分 略…… 后台部分 (注:这里的后台是用的nodejs搭建的,使用的是express框架+ejs模板) 首先通过express快速 ...

  5. python3 练手实例4 九九乘法口诀表

    for i in range(1,10): for j in range(1,i+1): print('{}*{}={}\t'.format(i,j,i*j),end='') print()

  6. 自定义Maven Archetype模板

    1. 目的 自定义Maven Archetype模板目的为了把自己辛苦搭建的基础项目可以作为模板, 方便以后可以快速的创建类似项目,免去每次搭建的麻烦 2.把基础项目打包生成archetype项目 在 ...

  7. 20164305 徐广皓 Exp3 免杀原理与实践

    免杀原理及基础问题回答 实验内容 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧 使用msf编码器生 ...

  8. sqlyog连接mysql8.0

    1.本人安装的是mysql8.0社区版,安装包名称:mysql-installer-community-8.0.12.0.msi,可自行到官网下载. 2.安装完成后用sqlyog连接数据库出现密码乱码 ...

  9. python&django 实现页面中关联查询小功能(中级篇)

    目的 组合搜索实现如下图功能 知识点 1.使用自定义标签模板(templatetags) 实现 models.py 和 views.py和初级篇一样 重点如下:在app01目录下创建templatet ...

  10. JAVA_Sprint学习(一)

    保存用户信息的编程思维 传统的思想,就是建立一个类之后,然后将用户的姓名和密码,以及添加用户等操作都放在一个main中, 按照抽象编程的思想而言, 首先建立一个类User,用来是表示用户的具体信息Us ...