当前位置: 首页 > 编程日记 > 正文

hdu5740

考验代码能力的题目,感觉网络流一要求输出方案我就写的丑

http://www.cnblogs.com/duoxiao/p/5777632.html 官方题解写的很详细

因为如果一个点染色确定后,整个图的染色也就确定了;

对于两个点u和v, 令它们之间的最短路是dis(u,v), 那么交换它们两个颜色的最少步数是dis(u,v), 且存在一种交换序列不会破坏其它节点的颜色

这是两个突破口

我的一个WA的地方在于:构造方案时没有把路径上的颜色交换……

  1 #include<bits/stdc++.h>
  2 #define mp make_pair
  3 #define pi pair<int,int>
  4 using namespace std;
  5 const int inf=1e9+7;
  6 struct node{int po,next,flow,cost;} e[2000010];
  7 pi a[100010];
  8 vector<pi> tmp;
  9 vector<int> g[510],s[2];
 10 int f[510][510],from[510][510],q[1000010],pre[510],cur[510],d[510],p[510],mark[510],cl[510],rc[510];
 11 bool v[510];
 12 int n,m,len,t,ans,s1,s0;
 13 void add(int x,int y,int f,int c)
 14 {
 15      e[++len].po=y;
 16      e[len].flow=f;
 17      e[len].cost=c;
 18      e[len].next=p[x];
 19      p[x]=len;
 20 }
 21 
 22 void build(int x,int y, int f, int c)
 23 {
 24      add(x,y,f,c);
 25      add(y,x,0,-c);
 26 }
 27 
 28 bool spfa()
 29 {
 30      int f=1,r=1;
 31      for (int i=1; i<=t; i++) d[i]=inf;
 32      memset(v,0,sizeof(v));
 33      d[0]=0; q[1]=0;
 34      while (f<=r)
 35      {
 36            int x=q[f++];
 37            v[x]=0;
 38            for (int i=p[x]; i!=-1; i=e[i].next)
 39            {
 40                int y=e[i].po;
 41                if (e[i].flow&&d[x]+e[i].cost<d[y])
 42                {
 43                   d[y]=d[x]+e[i].cost;
 44                   pre[y]=x; cur[y]=i;
 45                   if (!v[y])
 46                   {
 47                      q[++r]=y;
 48                      v[y]=1;
 49                   }
 50                }
 51            }
 52      }
 53      return d[t]<inf;
 54 }
 55 
 56 int mincost()
 57 {
 58     int s=0;
 59     while (spfa())
 60     {
 61           s+=d[t];
 62           for (int i=t; i; i=pre[i])
 63           {
 64               int j=cur[i];
 65               e[j].flow--;
 66               e[j^1].flow++;
 67           }
 68     }
 69     return s;
 70 }
 71 
 72 void bfs(int st)
 73 {
 74     memset(v,0,sizeof(v));
 75     for (int i=1; i<=n; i++) f[st][i]=inf;
 76     int h=1,r=1; q[1]=st; v[st]=0; f[st][st]=0;
 77     while (h<=r)
 78     {
 79         int x=q[h++];
 80         for (int i=0; i<g[x].size(); i++)
 81         {
 82             int y=g[x][i];
 83             if (!v[y])
 84             {
 85                 f[st][y]=f[st][x]+1;
 86                 from[st][y]=x;
 87                 v[y]=1;
 88                 q[++r]=y;
 89             }
 90         }
 91     }
 92 }
 93 
 94 bool get(int x,int w)
 95 {
 96     mark[x]=w; s[w].push_back(x);
 97     if (rc[x]==1) s1++; else s0++;
 98     for (int i=0; i<g[x].size(); i++)
 99     {
100         int y=g[x][i];
101         if (mark[y]==-1) get(y,w^1);
102         else if (mark[y]==mark[x]) return 0;
103     }
104     return 1;
105 }
106 
107 void path(int st,int en,int w)
108 {
109     int x=en,r=1; q[1]=en;
110     while (x!=st)
111     {
112         x=from[st][x];
113         q[++r]=x;
114         if (cl[x]^cl[q[1]])
115         {
116             for (int i=r; i>1; i--)
117             {
118                 tmp.push_back(mp(q[i],q[i-1]));
119                 swap(cl[q[i]],cl[q[i-1]]);
120             }
121             r=1; q[1]=x;
122         }
123     }
124 }
125 
126 void way(int w)
127 {
128     for (int i=1; i<=n; i++) cl[i]=rc[i];
129     for (int i=0; i<=len; i+=2)
130     {
131         int y=e[i].po,x=e[i^1].po;
132         if (x&&y<t&&e[i].flow==0) path(x,y,w);
133     }
134 }
135 
136 void graph(int w)
137 {
138     len=-1; memset(p,255,sizeof(p));
139     for (int i=0; i<s[0].size(); i++)
140     {
141         int x=s[0][i];
142         if (rc[x]^w) build(0,x,1,0);
143     }
144     for (int i=0; i<s[1].size(); i++)
145     {
146         int x=s[1][i];
147         if (rc[x]^w) continue;
148         build(x,t,1,0);
149         for (int j=0; j<s[0].size(); j++)
150         {
151             int y=s[0][j];
152             if (rc[y]^w) build(y,x,1,f[y][x]);
153         }
154     }
155 }
156 
157 bool check(int x)
158 {
159     s1=s0=0;
160     s[0].clear(); s[1].clear();
161     if (!get(x,0)) return 0;
162     if (s1+s0==1) return 1;
163     if (s0!=s[0].size()&&s0!=s[1].size()) return 0;
164     int ans1=inf,ans2=inf;
165     if (s0==s[0].size())
166     {
167         graph(0); ans1=mincost();
168         tmp.clear(); way(0);
169     }
170     if (s1==s[0].size())
171     {
172         graph(1);
173         ans2=mincost();
174     }
175     if (ans1==inf&&ans2==inf) return 0;
176     if (ans2<ans1)
177     {
178         tmp.clear(); way(1);
179         for (int i=0; i<tmp.size(); i++)
180             a[++ans]=tmp[i];
181     }
182     else {
183         for (int i=0; i<tmp.size(); i++)
184             a[++ans]=tmp[i];
185     }
186     return 1;
187 }
188 
189 int main()
190 {
191     int cas;
192     scanf("%d",&cas);
193     while (cas--)
194     {
195         scanf("%d%d\n",&n,&m);
196         for (int i=1; i<=n; i++) g[i].clear();
197         for (int i=1; i<=n; i++)
198         {
199             char ch=getchar();
200             rc[i]=ch-'0';
201         }
202         for (int i=1; i<=m; i++)
203         {
204             int x,y;
205             scanf("%d%d",&x,&y);
206             g[x].push_back(y);
207             g[y].push_back(x);
208         }
209         for (int i=1; i<=n; i++) bfs(i);
210         memset(mark,255,sizeof(mark));
211         bool ff=1; ans=0; t=n+1;
212         for (int i=1; i<=n; i++)
213             if (mark[i]==-1)
214             {
215                 ff&=check(i);
216                 if (!ff) break;
217             }
218 
219         if (!ff) puts("-1");
220         else {
221             printf("%d\n",ans);
222             for (int i=1; i<=ans; i++)
223                 printf("%d %d\n",a[i].first,a[i].second);
224         }
225     }
226 }
View Code

转载于:https://www.cnblogs.com/phile/p/6446057.html

相关文章:

xml操作类(转载)

作者&#xff1a;未知 请与本人联系 <%Class XMLDOMDocument Private fNode,fANode Private fErrInfo,fFileName,fOpen Dim XmlDom 返回节点的缩进字串 Private Property Get TabStr(byVal Node) TabStr"" If Node Is Nothing Then Exit Property …

对HDS AMS 2000+巡检案例

1. 使用工具&#xff1a;笔记本&#xff0c;网线一根&#xff0c; 2. 使用软件&#xff1a;vmware虚拟机&#xff08;安装XP P2系统&#xff0c;最好为P3&#xff09;&#xff0c;HSNM2-1152-W-CLI-P01.exe&#xff08;AMS 200管理软件&#xff09;&#xff0c;jre…

用Python实现坦克大战游戏 | 干货贴

作者 | 李秋键出品 | AI科技大本营&#xff08;rgznai100&#xff09;《坦克大战》是1985年日本南梦宫Namco游戏公司在任天堂FC平台上&#xff0c;推出的一款多方位平面射击游戏。游戏以坦克战斗及保卫基地为主题&#xff0c;属于策略型联机类。同时也是FC平台上少有的内建关卡…

SPU、SKU、ARPU是什么,我来记录一下我的理解

在电商系统里经常会提到“商品”、“单品”、“SPU”、“SKU”这几个词&#xff0c;那么这几个词到底是什么意思呢&#xff1f;既然不知道是什么&#xff0c;那么我们就查一下&#xff1a;SPU Standard Product Unit &#xff08;标准化产品单元&#xff09;&#xff0c;SKUst…

用C#操纵IIS(代码)

using System;using System.DirectoryServices;using System.Collections;using System.Text.RegularExpressions;using System.Text;/*** author 吴海燕* email wuhy80-usualyahoo.com* 2004-6-25 第一版*/ namespace Wuhy.ToolBox{/// <summary>/// 这个类是静态类。…

linux 内核参数调整说明

linux 内核参数调整说明 所有的TCP/IP调优参数都位于/proc/sys/net/目录。例如, 下面是最重要的一些调优参数, 后面是它们的含义: 1. /proc/sys/net/core/rmem_max — 最大的TCP数据接收缓冲。2. /proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲。3. /proc/sys/net/ipv4…

Java 最高均薪 19015 元! 9 月程序员工资出炉,你拖后腿了吗?

在全员争当码农的时代&#xff0c;如果你也想学一门编程语言&#xff0c;那么&#xff0c;我要告诉你&#xff0c;Java 是编程语言中不可撼动的王者。有点难理解&#xff1f;先看个排行榜???? 来自权威开发语言排行榜 TIOBE 的数据&#xff08;截止到 2020 年 4 月&#x…

java 基础知识八 正则表达式

正则表达式 是一种可以用于模式匹配和替换的规范&#xff0c; 一个正则表达式就是由普通的字符&#xff08;例如字符a到z&#xff09;以及特殊字符&#xff08;元字符&#xff09;组成的文字模式&#xff0c; 用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为…

PHP中Session的使用

启用配置//修改php.ini中的session.auto_start 0 为 session.auto_start 1session_start();$_SESSION[username]"HM";

《Two Dozen Short Lessons in Haskell》学习(八)- Function Types, Classes, and Polymorphism

《Two Dozen Short Lessons in Haskell》&#xff08;Copyright © 1995, 1996, 1997 by Rex Page&#xff0c;有人翻译为Haskell二十四学时教程&#xff0c;该书如果不用于赢利&#xff0c;可以任意发布&#xff0c;但需要保留他们的copyright&#xff09;这本书是学习 Ha…

图神经网络快速爆发,最新进展都在这里了

译者 | 刘畅出品 | AI科技大本营&#xff08;rgznai100&#xff09;近年来&#xff0c;图神经网络&#xff08;GNNs&#xff09;发展迅速&#xff0c;最近的会议上发表了大量相关的研究论文。本文作者正在整理一个GNN的简短介绍和最新研究报告的摘要。希望这对任何准备进入该领…

css去掉a标签点击后的虚线框

outline是css3的一个属性&#xff0c;用的很少。 声明&#xff0c;这是个不能兼容的css属性&#xff0c;在ie6、ie7、遨游浏览器都不兼容。 outline控制的到底是什么呢&#xff1f; 当聚焦a标签的时候&#xff0c;在a标签的区域周围会有一个虚线的框&#xff0c;这个框不同于bo…

在SQL Server中保存和输出任意类型的文件

我们可以把任意类型的文件保存到SQL Server中&#xff0c;在进行例子之前&#xff0c;先建立测试用表格&#xff0c;TestFile.sql&#xff1a;if exists (select * from dbo.sysobjects where id object_id(N[dbo].[TestFiles]) and OBJECTPROPERTY(id, NIsUserTable) 1) dro…

工作中InnoDB引擎数据库主从复制同步心得

近期将公司的MySQL架构升级了&#xff0c;由原先的一主多从换成了DRBDHeartbeat双主多从&#xff0c;正好手上有一个电子商务网站新项目也要上线了&#xff0c;用的是DRBDHeartbeat双主一从&#xff0c;由于此过程还是有别于以前的MyISAM引擎的&#xff0c;所以这里也将其心得归…

面试官:因为这个语言,我淘汰了90%的人!

很多人都有这样的经历&#xff1a;大量重复性工作&#xff1b;日报、周报、各种报&#xff0c;无穷无尽&#xff1b;不计其数的数据提取琐碎繁杂的事务让工作的效率极低。如果可以一键完成就好了。对这些问题来说&#xff0c;最高效的解决途径就是 Python。1991 年&#xff0c;…

SQL Server不能启动

SQL Server不能正常启动 I had a similar issue after uninstalling Visual Studio 2010 (which autmatically came with a Visual Studio Express 2013 install). I solved it by going through the follwing steps. Installing Visual Studio 2010 shell from here: https://…

ASP.NET 配置节架构

ASP.NET 配置节架构包含控制 ASP.NET Web 应用程序行为的元素。如果为属性指定了默认值&#xff0c;则该默认值是在 Machine.config 文件中设置的&#xff0c;该文件的路径是 systemroot/Microsoft.NET/Framework/versionNumber/CONFIG/Machine.config。 <configuration>…

IEEE迎来首位华人主席,马里兰大学终身教授刘国瑞当选

10月12日&#xff0c;IEEE宣布马里兰大学终身教授刘国瑞&#xff08;K. J. Ray Liu&#xff09;当选为2021年IEEE主席&#xff0c;他也是首位当选IEEE主席的华人学者&#xff0c;他将在明年1月开始接任现任IEEE主席Susan K. Kathy Land的职务。 在此次IEEE候选主席竞选中&#…

Visual C++ 2010 简介

VC是用来创建基于 Microsoft Windows 和 Microsoft .NET 的应用程序 原文地址&#xff1a;http://msdn.microsoft.com/zh-cn/library/60k1461a%28vvs.100%29.aspx提供了强大而灵活的开发环境&#xff0c;用于创建基于 Microsoft Windows 和 Microsoft .NET 的应用程序。您可以在…

Linux网络编程:基于UDP的程序开发回顾篇

基于无连接的UDP程序设计 同样&#xff0c;在开发基于UDP的应用程序时&#xff0c;其主要流程如下&#xff1a; 对于面向无连接的UDP应用程序在开发过程中服务端和客户端的操作流程基本差不多。对比面向连接的TCP程序&#xff0c;服务端少了listen和accept函数。前面我们也说过…

四款5G版iPhone 12齐发,苹果股价却应声而跌

整理 | 郑丽媛、屠敏题图 | 东方IC来源 | CSDN&#xff08;CSDNnews&#xff09;真快&#xff0c;又见面了。北京时间 10 月 14 日凌晨 1 点&#xff0c;Apple 举办的新品发布会如约而至。今年有关 iPhone 新品的到来有些迟&#xff0c;好在「5G just got real」&#xff0c;万…

Linux编译器GCC的使用

嵌入式Linux编译器GCC的使用 1、GCC概述 作为自由软件的旗舰项目&#xff0c;Richard Stallman在十多年前刚开始写作GCC的时候&#xff0c;还只是仅仅把它当作一个C程序语言的编译器&#xff0c;GCC的意思也只是GNU C Compiler而已。 经过了这么多年的发展&#xff0c;GCC已经不…

jquery兼容IE和火狐下focus()事件

<input type"text" id"my" name"my" /> <script type"text/javascript">$("#my").focus(); </script> 上面的代码在IE下是没有任何问题的,但是不兼容FF,在FF没有反应解决办法:兼容写法 IE和FF下focus()事…

Access-Control-Allow-Origin这个header这个头不能设置通配符域名

这个header属性&#xff0c;要么设置为*&#xff0c;即任何域名来源都行&#xff0c;要么就只能设置为一个或多个&#xff0c;确定的域名&#xff0c;不能使用通配符域名转载于:https://www.cnblogs.com/abcbuzhiming/p/6478910.html

MySQL Xtrabackup备份和恢复

简介 Xtrabackup是由percona提供的mysql数据库备份工具&#xff0c;据官方介绍&#xff0c;这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。特点&#xff1a;(1)备份过程快速、可靠&#xff1b;(2)备份过程不会打断正在执行的事务&#xff1b;(3)能够基…

​吐血整理:手拿几个大厂offer的秘密武器!

怎样才能拿到大厂的offer&#xff1f;没有掌握绝对的技术&#xff0c;那么就要不断的学习。如何拿下阿里等大厂的offer呢&#xff0c;今天分享一个秘密武器&#xff0c;资深架构师整理的Java核心知识点&#xff0c;面试时面试官必问的知识点&#xff0c;篇章包括了很多知识点&a…

.NET中获取电脑名,IP地址,当前用户

在.NET中获取一台电脑名&#xff0c;IP地址及当前用户名是非常简单&#xff0c;以下是我常用的几种方法,如果大家还有其它好的方法&#xff0c;可以回复一起整理&#xff1a; 1. 在ASP.NET中专用属性&#xff1a; 获取服务器电脑名: Page.Server.ManchineName 获取用户信息:…

SpringMVC注解整理

2019独角兽企业重金招聘Python工程师标准>>> 使用注解之前要开启自动扫描功能 其中base-package为需要扫描的包(含子包)。 <context:component-scan base-package"cn.test"/> Configuration把一个类作为一个IoC容器&#xff0c;它的某个方法头上如果…

Facebook是如何做搜索的?

作者 | 一块小蛋糕来源 | NewBeeNLP今天要和大家分享的论文是来自Facebook的『Embedding based Retrieval in Facebook Search』。不得不说&#xff0c;F家的文章还是一如既往浓浓的工业风&#xff0c;这篇论文从工程角度讲解了一个召回的全流程&#xff0c;不管是做语义信息检…

JavaScript[对象.属性]集锦

作者&#xff1a; 蓝色理想 SCRIPT 标记? 用于包含JavaScript代码.? 属性? LANGUAGE 定义脚本语言? SRC 定义一个URL用以指定以.JS结尾的文件? windows对象? 每个HTML文档的顶层对象.? 属性? frames[] 子桢数组.每个子桢数组按源文档中定义的顺序存放.? feames…