hdu 3472 HS BDC(混合路的欧拉路径)
这题是混合路的欧拉路径问题。
1.判断图的连通性,若不连通,无解。
2.给无向边任意定向,计算每个结点入度和出度之差deg[i]。deg[i]为奇数的结点个数只能是0个或2个,否则肯定无解。
3.(若存在2个deg[i]为奇数的结点,则在两点连一条流量为1的边,方向任意)设立源点s和汇点t(自己另外定两个点),若某点i入度<出度,连边(s,i,-deg[i]/2),若入度>出度,连边(i,t,deg[i]/2);对于任意定向的无向边(i,j,1)。
5.若从S发出的边全部满流,证明存在欧拉回路(路径),否则不存在。


view code#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
typedef long long ll;
const int INF = 1<<30;
const int N = 2010;
int _,cas=1, n, fa[30], pre[30], deg[30], s, t, d[30];
int cur[30];
bool vis[30]; struct edge
{
int u, v, cap, next;
edge() {}
edge(int u, int v, int w, int next):u(u),v(v),cap(w),next(next) {}
}e[N<<1];
int ecnt; void addedge(int u, int v, int w)
{
e[ecnt] = edge(u, v, w, pre[u]);
pre[u] = ecnt++;
e[ecnt] = edge(v, u, 0, pre[v]);
pre[v] = ecnt++;
} int find(int x)
{
return x==fa[x]?x:(fa[x]=find(fa[x]));
} void Union(int u, int v)
{
u = find(u), v= find(v);
if(u==v) return ;
fa[u] = v;
} bool is_ok()
{
for(int i=0; i<26; i++) if(vis[i] && find(i)!=find(s)) return false;
int res = 0;
for(int i=0; i<26; i++) if(deg[i]%2){
res++;
if(res==1) s = i;
else t = i;
}
return res==0 || res==2;
} bool BFS()
{
memset(vis, 0, sizeof(vis));
queue<int >q;
q.push(s);
d[s] = 0, vis[s]=1;
while(!q.empty())
{
int u = q.front(); q.pop();
for(int i=pre[u]; ~i; i=e[i].next)
{
int v = e[i].v;
if(!vis[v] && e[i].cap>0)
{
vis[v] = 1;
d[v] = d[u] +1;
q.push(v);
}
}
}
return vis[t];
} int DFS(int u, int c)
{
if(u==t || c==0) return c;
int flow=0, f;
for(int &i=pre[u]; ~i; i=e[i].next)
{
int v = e[i].v;
if(d[v]==d[u]+1 && (f=DFS(v, min(c, e[i].cap)))>0)
{
e[i].cap -= f;
e[i^1].cap += f;
flow += f;
c -= f;
if(c==0) break;
}
}
return flow;
} int Maxflow()
{
int flow = 0;
while(BFS())
{
memcpy(cur, pre, sizeof(pre));
flow += DFS(s, INF);
}
return flow;
} void solve()
{
scanf("%d", &n);
memset(pre, -1, sizeof(pre));
memset(deg, 0, sizeof(deg));
memset(vis, 0, sizeof(vis));
for(int i=0; i<27; i++) fa[i] = i;
ecnt = 0;
int rev; char str[27];
for(int i=0; i<n; i++)
{
scanf("%s%d", str, &rev);
int u = str[0]-'a', v = str[strlen(str)-1]-'a';
deg[u]--; deg[v]++;
vis[u] = vis[v] = true;
s = u;
if(rev) addedge(u, v, 1);
Union(u,v);
}
t = -1;
printf("Case %d: ", cas++);
if(!is_ok()) {
puts("Poor boy!");
return ;
}
if(t!=-1) addedge(t, s, 1);
s = 26, t = 27;
int fulflow = 0, flow;
for(int i=0; i<26; i++)
{
if(deg[i]==0) continue;
if(deg[i]<0) addedge(s, i, -deg[i]/2);
else addedge(i, t, deg[i]/2), fulflow+=deg[i]/2;
}
flow = Maxflow();
puts(flow==fulflow?"Well done!":"Poor boy!");
} int main()
{
// freopen("in.txt", "r", stdin);
cin>>_;
while(_--) solve();
return 0;
}
hdu 3472 HS BDC(混合路的欧拉路径)的更多相关文章
- HDU 3472 HS BDC (混合图的欧拉路径判断)
HS BDC Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HS BDC HDU - 3472(混合欧拉路径)
题意: 就是混合欧拉路径板题 解析: 欧拉路径加一条t_ ---> s_ 的边就变成了欧拉回路,所以利用这一点,如果存在两个奇点,那么这两个奇点出度大的是s_,入度大的是t_,加一条t_ -- ...
- HDU 3472 混合图欧拉回路 + 网络流
九野的博客,转载请注明出处:http://blog.csdn.net/acmmmm/article/details/13799337 题意: T个测试数据 n串字符 能否倒过来用(1表示能倒着用) 问 ...
- HDU 3535 AreYouBusy (混合背包)
题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下 ...
- [HDU 3535] AreYouBusy (动态规划 混合背包 值得做很多遍)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n个任务集合,需要在T个时间单位内完成.每个任务集合有属性,属性为0的代表至少要完成1个 ...
- HDU 3535 AreYouBusy (混合背包之分组背包)
题目链接 Problem Description Happy New Term! As having become a junior, xiaoA recognizes that there is n ...
- HDU 3535 AreYouBusy 经典混合背包
AreYouBusy Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Su ...
- HDU 2242 双连通分量 考研路茫茫——空调教室
思路就是求边双连通分量,然后缩点,再用树形DP搞一下. 代码和求强连通很类似,有点神奇,=_=,慢慢消化吧 #include <cstdio> #include <cstring&g ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
随机推荐
- 性能测试学习之二 ——性能测试模型(PV计算模型)
PV计算模型 现有的PV计算公式是: 每台服务器每秒平均PV量 =( (总PV*80%)/(24*60*60*40%))/服务器数量 =2*(总PV)/* (24*60*60) /服务器数量 通过定积 ...
- 我们的相识,总是那么巧。-------eclipse中搭建maven项目
一.我们就来谈下eclipse中搭建maven web工程的步骤!虽然就是一个简单的例子,但是过程是很艰辛的. 首先我们看一下eclipse的封面,下面就是刚打开的华丽封面哦 其次我安装了eclips ...
- java RSA加解密以及用途
在公司当前版本的中间件通信框架中,为了防止非授权第三方和到期客户端的连接,我们通过AES和RSA两种方式的加解密策略进行认证.对于非对称RSA加解密,因为其性能耗费较大,一般仅用于认证连接,不会用于每 ...
- 微信浏览器或各种移动浏览器上:active伪类做的触觉反馈失效
在做移动端页面的时候,会发现PC上那种:hover的效果是不管用了的,但又要给用户一个点击反馈怎么办呢?我管它叫触觉反馈. 细心点就会发现浏览器有自带了一点触觉反馈,在点击a.button.input ...
- web页面直接跳转至其他页面
<script type="text/javascript">window.location.herf="../../XXXXX.aspx";< ...
- user profile services提示“BAIL: MMS(7116): sql.cpp(8490): 0x80231334 (The sql connection string has unsupported values.)”解决办法
user profile services的2个服务Forefront Identity Manager Service 和 Forefront Identity Manager Synchroniz ...
- .Net关闭数据库连接时判断ConnectionState为Open还是Closed?
两种写法: if (conn.State == System.Data.ConnectionState.Open) { conn.Close(); ...
- xmpp整理笔记:xmppFramework框架的导入和介绍
一个将要开发xmpp的项目,建议在项目刚创建就导入框架,这样可以避免一些自己操作失误造成不必要的损失. xmpp中最常用的框架就是 xmppFrameWork 往期回顾: xmpp整理笔记:环境的快速 ...
- GpsLocationProvider中的sendExtraCommand方法
Android系统源码中GpsLocationProvider类中包含sendExtraCommand方法,代码如下 @Override public boolean sendExtraCommand ...
- 代码创建storyboard
代码创建storyboard方式如下 // 加载storyboard UIStoryboard *storyboard = [UIStoryboard StoryboardWithName:@&quo ...