这题是混合路的欧拉路径问题。

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(混合路的欧拉路径)的更多相关文章

  1. HDU 3472 HS BDC (混合图的欧拉路径判断)

    HS BDC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  2. HS BDC HDU - 3472(混合欧拉路径)

    题意: 就是混合欧拉路径板题 解析: 欧拉路径加一条t_ ---> s_  的边就变成了欧拉回路,所以利用这一点,如果存在两个奇点,那么这两个奇点出度大的是s_,入度大的是t_,加一条t_ -- ...

  3. HDU 3472 混合图欧拉回路 + 网络流

    九野的博客,转载请注明出处:http://blog.csdn.net/acmmmm/article/details/13799337 题意: T个测试数据 n串字符 能否倒过来用(1表示能倒着用) 问 ...

  4. HDU 3535 AreYouBusy (混合背包)

    题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下 ...

  5. [HDU 3535] AreYouBusy (动态规划 混合背包 值得做很多遍)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n个任务集合,需要在T个时间单位内完成.每个任务集合有属性,属性为0的代表至少要完成1个 ...

  6. HDU 3535 AreYouBusy (混合背包之分组背包)

    题目链接 Problem Description Happy New Term! As having become a junior, xiaoA recognizes that there is n ...

  7. HDU 3535 AreYouBusy 经典混合背包

    AreYouBusy Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Su ...

  8. HDU 2242 双连通分量 考研路茫茫——空调教室

    思路就是求边双连通分量,然后缩点,再用树形DP搞一下. 代码和求强连通很类似,有点神奇,=_=,慢慢消化吧 #include <cstdio> #include <cstring&g ...

  9. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

随机推荐

  1. nodejs中全局变量

    1.global 类似于客户端javascript运行环境中的window module1.js: module.exports={}; //耻辱的使用了全局变量 global.varA = &quo ...

  2. AWS CloudFront CDN直接全站加速折腾记The request could not be satisfied. Bad request

    ERROR The request could not be satisfied. Bad request. Generated by cloudfront (CloudFront) Request ...

  3. 使用 WordPress 主题制作的20个精美网页

    WordPress 是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用 PHP 语言和 MySQL 数据库开发的.用户可以在支持 PHP 和 MySQL 数据库的服务器上使用自己的博客.这 ...

  4. 渗透测试常规思路分析-FREEBUF

    最基础但练得好最后也非常厉害 1.  主要由于服务器配置等原因造成的信息泄露 常用google ,bing等搜索工具,轻量级的搜索出一些遗留后门,不想被发现的后台入口,中量级的搜索出一些用户信息泄露, ...

  5. Convert.ChangeType不能处理Nullable类型的解决办法

    在做一个ORMapping功能的时候发现,Convert.ChangeType不能处理nullable类型,比如int?. 解决办法也很简单,贴出完整的代码(大部分代码来自网络),注意下面代码没经过完 ...

  6. 100个高质量Java开发者博客

    ImportNew注:原文中还没有100个.作者希望大家一起来推荐高质量的Java开发博客,然后不段补充到这个列表.欢迎你也参与推荐优质的Java开发博客.(声明一下:我们的数学不是体育老师教的!:) ...

  7. Android使用Fragment来实现ViewPager的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信

    以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3364728.html 我前两天写过一篇博客<Android使用Fragment来 ...

  8. Java实现---堆排序 Heap Sort

    堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先讲解下什么是数据结构中的二叉堆. 堆的定义 n个元素的序列{k1,k2,…,kn}当且仅当满足下列关 ...

  9. Android 网络图片查看器

    今天来实现一下android下的一款简单的网络图片查看器 界面如下: 代码如下: <LinearLayout xmlns:android="http://schemas.android ...

  10. iOS6、7、8、9新特性汇总和适配说明

    iOS6新特性 一.关于内存警告 ios6中废除了viewDidUnload,viewWillUnload这两个系统回调,收到内存警告时在didReceiveMemoryWarning中进行相关的处理 ...