二分最大边权,即有些边强制不能被选

接下来,即任意一点上某两边不能同时被选,以及任意一点上颜色相同的两边必须被选择一条

这些限制都可以用2-sat的形式来描述(强制不能选即连边"选->不选"),但后两类的边数达到了$o(m^{2})$,时间复杂度上无法接受

当一个节点上有一种颜色的边出现3次,或有两种颜色的边出现两次,必然不合法,因此第3类限制的边每一个点上至多只有1条,即为$o(n)$

对于第2类限制,即该点上任意一边都要向其余边连线,那么即新建一些点来优化连边

更具体的,假设某个点上相关的边分别对应点$a_{1},a_{2},...,a_{k}$和$a'_{1},a'_{2},...,a_{k}$(后者表示不选),即需要连边$(a_{i},a'_{j})$(其中$i\ne j$)

新建$s_{1},s_{2},...,s_{k}$,连边$(s_{i},s_{i-1})$和$(s_{i},a'_{i})$,再连边$(a_{i},s_{i-1})$即实现了连边$(a_{i},a'_{j})$(其中$j<i$)

对于$j>i$类似,即连边$(s'_{i},s'_{i+1})$和$(s'_{i},a'_{i})$,再连边$(a_{i},s'_{i+1})$即可

综上,即将边数优化为$o(m)$,可以通过

(关于这个,也可以理解为前后缀的构造)

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 #define N 100005
  4. 4 struct Edge{
  5. 5 int nex,to,color,len;
  6. 6 }edge[N];
  7. 7 vector<int>v,ans,A[N*3],B[N*3];
  8. 8 map<int,int>tot,lst;
  9. 9 int V,E,n,m,x,y,c,z,scc,head[N],vis[N*3],dfn[N*3],bl[N*3];
  10. 10 void add_edge(int x,int y,int c,int z){
  11. 11 edge[E].nex=head[x];
  12. 12 edge[E].to=y;
  13. 13 edge[E].color=c;
  14. 14 edge[E].len=z;
  15. 15 head[x]=E++;
  16. 16 }
  17. 17 void add_2sat(int x,int y){
  18. 18 A[x].push_back(y);
  19. 19 B[y].push_back(x);
  20. 20 }
  21. 21 void del_2sat(int x,int y){
  22. 22 A[x].pop_back();
  23. 23 B[y].pop_back();
  24. 24 }
  25. 25 void dfs1(int k){
  26. 26 if (vis[k])return;
  27. 27 vis[k]=1;
  28. 28 for(int i=0;i<A[k].size();i++)dfs1(A[k][i]);
  29. 29 dfn[++dfn[0]]=k;
  30. 30 }
  31. 31 void dfs2(int k){
  32. 32 if (bl[k])return;
  33. 33 bl[k]=scc;
  34. 34 for(int i=0;i<B[k].size();i++)dfs2(B[k][i]);
  35. 35 }
  36. 36 bool calc(int k){
  37. 37 for(int i=0;i<E;i+=2)
  38. 38 if (edge[i].len>k)add_2sat((i>>1),(i>>1)+m);
  39. 39 scc=dfn[0]=0;
  40. 40 memset(vis,0,sizeof(vis));
  41. 41 memset(bl,0,sizeof(bl));
  42. 42 for(int i=0;i<V;i++)
  43. 43 if (!vis[i])dfs1(i);
  44. 44 for(int i=dfn[0];i;i--)
  45. 45 if (!bl[dfn[i]]){
  46. 46 scc++;
  47. 47 dfs2(dfn[i]);
  48. 48 }
  49. 49 bool flag=1;
  50. 50 for(int i=0;i<m;i++)
  51. 51 if (bl[i]==bl[i+m]){
  52. 52 flag=0;
  53. 53 break;
  54. 54 }
  55. 55 for(int i=0;i<E;i+=2)
  56. 56 if (edge[i].len>k)del_2sat((i>>1),(i>>1)+m);
  57. 57 return flag;
  58. 58 }
  59. 59 int main(){
  60. 60 scanf("%d%d",&n,&m);
  61. 61 memset(head,-1,sizeof(head));
  62. 62 for(int i=1;i<=m;i++){
  63. 63 scanf("%d%d%d%d",&x,&y,&c,&z);
  64. 64 add_edge(x,y,c,z);
  65. 65 add_edge(y,x,c,z);
  66. 66 }
  67. 67 V=(m<<1);
  68. 68 for(int i=1;i<=n;i++){
  69. 69 x=y=-1;
  70. 70 v.clear(),tot.clear(),lst.clear();
  71. 71 for(int j=head[i];j!=-1;j=edge[j].nex){
  72. 72 tot[edge[j].color]++;
  73. 73 if (tot[edge[j].color]>2){
  74. 74 printf("No");
  75. 75 return 0;
  76. 76 }
  77. 77 if (tot[edge[j].color]==2){
  78. 78 if ((x>=0)&&(y>=0)){
  79. 79 printf("No");
  80. 80 return 0;
  81. 81 }
  82. 82 x=(lst[edge[j].color]>>1);
  83. 83 y=(j>>1);
  84. 84 }
  85. 85 lst[edge[j].color]=j;
  86. 86 v.push_back(j>>1);
  87. 87 }
  88. 88 if ((x>=0)&&(y>=0)){
  89. 89 add_2sat(x+m,y);
  90. 90 add_2sat(y+m,x);
  91. 91 }
  92. 92 for(int j=0;j<v.size();j++){
  93. 93 add_2sat(V+j,v[j]+m);
  94. 94 add_2sat(V+j+v.size(),v[j]+m);
  95. 95 }
  96. 96 for(int j=1;j<v.size();j++){
  97. 97 add_2sat(V+j,V+j-1);
  98. 98 add_2sat(V+j+v.size()-1,V+j+v.size());
  99. 99 add_2sat(v[j],V+j-1);
  100. 100 add_2sat(v[j-1],V+j+v.size());
  101. 101 }
  102. 102 V+=(v.size()<<1);
  103. 103 }
  104. 104 int l=0,r=0x3f3f3f3f;
  105. 105 while (l<r){
  106. 106 int mid=(l+r>>1);
  107. 107 if (calc(mid))r=mid;
  108. 108 else l=mid+1;
  109. 109 }
  110. 110 if (l==0x3f3f3f3f)printf("No");
  111. 111 else{
  112. 112 calc(l);
  113. 113 for(int i=0;i<m;i++)
  114. 114 if (bl[i]>bl[i+m])ans.push_back(i+1);
  115. 115 printf("Yes\n%d %d\n",l,ans.size());
  116. 116 for(int i=0;i<ans.size();i++)printf("%d ",ans[i]);
  117. 117 }
  118. 118 }

[cf587D]Duff in Mafia的更多相关文章

  1. 【CF587D】Duff in Mafia 二分+前缀优化建图+2-SAT

    [CF587D]Duff in Mafia 题意:给你一张n个点m条边的无向图,边有颜色和边权.你要从中删去一些边,满足: 1.任意两条删掉的边没有公共的顶点.2.任意两条剩余的.颜色相同的边没有公共 ...

  2. Codeforces 587D - Duff in Mafia(2-SAT+前后缀优化建图)

    Codeforces 题面传送门 & 洛谷题面传送门 2-SAT hot tea. 首先一眼二分答案,我们二分答案 \(mid\),那么问题转化为,是否存在一个所有边权都 \(\le mid\ ...

  3. 2021record

    2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...

  4. 2-SET 前缀优化建图

    1, Duff in Mafia CodeForces - 587D 2, Ants CodeForces - 1007D

  5. cf Round 587

    A.Duff and Weight Lifting(思维) 显然题目中只有一种情况可以合并 2^a+2^a=2^(a+1).我们把给出的mi排序一下,模拟合并操作即可. # include <c ...

  6. Codeforces Round #326 (Div. 2) B. Pasha and Phone C. Duff and Weight Lifting

    B. Pasha and PhonePasha has recently bought a new phone jPager and started adding his friends' phone ...

  7. 【转】Duff's Device

    在看strcpy.memcpy等的实现发现用了内存对齐,每一个word拷贝一次的办法大大提高了实现效率,参加该blog(http://totoxian.iteye.com/blog/1220273). ...

  8. [BZOJ1163][BZOJ1339][Baltic2008]Mafia

    [BZOJ1163][BZOJ1339][Baltic2008]Mafia 试题描述 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价,现在警方希望使用 ...

  9. Codeoforces 558 B. Duff in Love

    //   B. Duff in Love time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

随机推荐

  1. Redis缓存穿透、缓存击穿、缓存雪崩的介绍及其解决方案

    首先,来画一张图了解下缓存处理的流程 一.缓存穿透 描述: 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求查询该数据,导致数据库压力过大. 解决方案: 1.接口校验 如鉴权校验.数据合法性 ...

  2. NET5 EF Core添加EF生成SQL日志记录

    1.添加NuGet包:Microsoft.Extensions.Logging.Debug 2.添加单独类库用于后期维护:BCode.DataBase.Log 3.添加EFCoreLoggerProv ...

  3. 洛谷4895 独钓寒江雪 (树哈希+dp+组合)

    qwq 首先,如果是没有要求本质不同的话,那么还是比较简单的一个树形dp 我们令\(dp[i][0/1]\)表示是否\(i\)的子树,是否选\(i\)这个点的方案数. 一个比较显然的想法. \(dp[ ...

  4. CORS+XSS的漏洞利用payload

    之前有人问我有没有CORS+XSS的利用姿势,翻了一下国内貌似都没有利用姿势于是就写了这篇文章!!! 首先找到一个反射xss,然后使用xss加载javascript代码达到跨域劫持目的payload如 ...

  5. from athletelist import AthleteList出现红色下滑波浪线警告

    问题:from athletelist import AthleteList出现红色下滑波浪线警告 经过个人网上搜索了解,这个问题是因为python找不到相关的.py文件,无法导入athletelis ...

  6. DM8数据库单机安装

    一.系统概要 表1 部署情况一览表 操作系统 Windows10 数据库版本 DM8(开发版) 数据库类型 单机 磁盘挂载 无 Key信息 无 二.操作系统信息检查 2.1 操作系统版本 [root@ ...

  7. Golang通脉之错误处理

    在实际工程项目中,总是通过程序的错误信息快速定位问题,但是又不希望错误处理代码写的冗余而又啰嗦.Go语言没有提供像Java.C#语言中的try...catch异常处理方式,而是通过函数返回值逐层往上抛 ...

  8. 正则表达式匹配 牛客网 剑指Offer

    正则表达式匹配 牛客网 剑指Offer 题目描述 请实现一个函数用来匹配包括'.'和''的正则表达式.模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次). 在本题中, ...

  9. hdu 5172 GTY's gay friends(线段树最值)

    题意: GTY有n个朋友,站成一排,每个人有一个特征值ai. 有m个询问.每次询问给两个数L,R.问你[L,R](即aL...aR)是否是1..(R-L+1)的一个全排列. 是输出YES,否则输出NO ...

  10. Centos7 升级过内核 boot分区无法挂载修

    参考连接:https://www.cnblogs.com/heqiuyong/p/11186301.html 故障图 挂载系统盘,光盘启动,急救模式, chroot /mnt/sysimage 报错 ...