题意:

      给你一些字符串,有的字符串反过来也有意义,题目问给的这n个字符串是否可以首尾相连,组成一个串。

思路:

      算是混合欧拉的基础题目了,混合欧拉就是专门处理这类问题的,先说下混合欧拉的大体步骤。

(1) 判断整个图是否连通,如果不连通直接不行(方法随意,并查集搜索什么的都行)

(2) 看度数差为奇数的有多少个,只能有0个或者两个,其他的都不行。

(3) 如果度数差有奇数的有两个,那么一定一个是正的v1,一个是负的v2,add(v1       ,v2 ,1);

(4) 如果方向随意的边,那么我们随意建立一条就行add(a ,b ,1),方向固定的不用管

(5) 虚拟超级远点s,超级汇点e,然后所有度数为负数的add(s ,i ,-du[i]/2),所有为      正的add(i ,e ,du[i]/2);

(6) 最后一遍最大流,看是否满流,如果满流,那么就是有解,否则无解。

至于为什么费用留可以这样求,等比赛回来再来详细补充这个问题。

#include<queue>

#include<stdio.h>

#include<string.h>

#define N_node 30

#define N_edge 10000

#define INF 100000000

using namespace std;

typedef struct

{

   int to ,next ,cost;

}STAR;

typedef struct

{

   int x ,t;

}DEP;

STAR E[N_edge];

DEP xin ,tou;

int list[N_node] ,listt[N_node] ,tot;

int du[N_node] ,deep[N_node];

int mer[N_node];

void add(int a, int b ,int c)

{

   E[++tot].to = b;

   E[tot].cost = c;

   E[tot].next = list[a];

   list[a] = tot;

  

   E[++tot].to = a;

   E[tot].cost = 0;

   E[tot].next = list[b];

   list[b] = tot;

}

int minn(int x ,int y)

{

   return x < y ? x : y;

}

int finds(int x)

{

   return x == mer[x] ? x : mer[x] = finds(mer[x]);

}

bool BFS_Deep(int s ,int t ,int n)

{

   memset(deep ,255 ,sizeof(deep));

   queue<DEP>q;

   xin.x = s ,xin.t = 0;

   q.push(xin);

   deep[xin.x] = xin.t;

   while(!q.empty())

   {

      tou = q.front();

      q.pop();

      for(int k = list[tou.x] ;k ;k = E[k].next)

      {

         xin.x = E[k].to;

         xin.t = tou.t + 1;

         if(deep[xin.x] != -1 || !E[k].cost) continue;

         deep[xin.x] = xin.t;

         q.push(xin);

      }

   }

   for(int i = 0 ;i <= n ;i ++)

   listt[i] = list[i];

   return deep[t] != -1;

}

int DFS_Flow(int s ,int t ,int flow)

{

   if(s == t) return flow;

   int nowflow = 0;

   for(int k = listt[s] ;k ;k = E[k].next)

   {

      int to = E[k].to;

      int c = E[k].cost;

      listt[s] = k;

      if(deep[to] != deep[s] + 1 || !c) continue;

      int tmp = DFS_Flow(to ,t ,minn(c ,flow - nowflow));

      nowflow += tmp;

      E[k].cost -= tmp;

      E[k^1].cost += tmp;

      if(nowflow == flow) break;

   }

   if(!nowflow) deep[s] = 0;

   return nowflow;

}

int DINIC(int s ,int t ,int n)

{

   int Ans = 0;

   while(BFS_Deep(s ,t ,n))

   {

      Ans =+ DFS_Flow(s ,t ,INF);

   }

   return Ans;

}

int main ()

{

   int n ,i ,j ,a ,b ,c;

   int mark[30];

   int t ,cas = 1;

   char str[30];

   scanf("%d" ,&t);

   while(t--)

   {

      scanf("%d" ,&n);

      memset(list ,0 ,sizeof(list)) ,tot = 1;

      memset(du ,0 ,sizeof(du));

      memset(mark ,0 ,sizeof(mark));

      for(i = 1 ;i <= 26 ;i ++) mer[i] = i;

     

      for(i = 1 ;i <= n ;i ++)

      {

         scanf("%s %d" ,str ,&c);

         a = str[0] - 'a' + 1;

         b = str[strlen(str)-1] - 'a' + 1;

         du[a] -- ,du[b] ++;

         mark[a] = mark[b] = 1;

         mer[finds(a)] = finds(b);

         if(c) add(a ,b ,1);

      }

     

      int sum = 0;

      for(i = 1 ;i <= 26 && sum <= 2;i ++)

      if(finds(i) == i && mark[i])  sum ++;

      printf("Case %d: " ,cas ++);

      if(sum != 1)

      {

         puts("Poor boy!");

         continue;

      }

     

      sum = 0;

      int v1 ,v2;

      for(i = 1 ;i <= 26 ;i ++)

      {

         if(du[i] % 2 && du[i] < 0) v1 = i ,sum ++;

         if(du[i] % 2 && du[i] > 0) v2 = i ,sum ++;

      }

      if(sum != 0 && sum != 2)

      {

          puts("Poor boy!");

          continue;

      }

      if(sum == 2)

      {

         add(v1 ,v2 ,1);

         du[v1] -- ,du[v2] ++;

      }

     

      sum = 0;

      for(i = 1 ;i <= 26 ;i ++)

      {

         if(!mark[i]) continue;

         if(du[i] < 0) add(0 ,i ,-du[i]/2) ,sum -= du[i]/2;

         else add(i ,27 ,du[i]/2);

      }

      DINIC(0 ,27 ,27) == sum ? puts("Well done!"):puts("Poor boy!");

   }

   return 0;

}

     

     

     

     

     

     

     

hdu3472 混合欧拉的更多相关文章

  1. hdu4067 费用流(混合欧拉的宽展和延伸)

    题意:        给以一个图,每个有向边都有两个权值,a,b其中a是保留这条边的花费,b是删除这条边的花费,让你删去一些边使图满足一下要求: (1)只有一个起点和一个终点 (2)所有的边都是又向的 ...

  2. hdu3472 混合图判断欧拉通路

    对于欧拉回路,先判断出度入度的差是否为偶数,然后最大流一次. 此题是判断有无欧拉通路,前提要判断图是否连通,然后欧拉通路的条件:要么出入度差没有奇数,或者只有2个点. 所以先统计差为奇数的个数,如果不 ...

  3. hdu2588 GCD (欧拉函数)

    GCD 题意:输入N,M(2<=N<=1000000000, 1<=M<=N), 设1<=X<=N,求使gcd(X,N)>=M的X的个数.  (文末有题) 知 ...

  4. BZOJ 2705: [SDOI2012]Longge的问题 [欧拉函数]

    2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2553  Solved: 1565[Submit][ ...

  5. BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4436  Solved: 1957[Submit][Status][Discuss ...

  6. Euler-Maruyama discretization("欧拉-丸山"数值解法)

    欧拉法的来源 在数学和计算机科学中,欧拉方法(Euler method)命名自它的发明者莱昂哈德·欧拉,是一种一阶数值方法,用以对给定初值的常微分方程(即初值问题)求解.它是一种解决常微分方程数值积分 ...

  7. COGS2531. [HZOI 2016]函数的美 打表+欧拉函数

    题目:http://cogs.pw/cogs/problem/problem.php?pid=2533 这道题考察打表观察规律. 发现对f的定义实际是递归式的 f(n,k) = f(0,f(n-1,k ...

  8. poj2478 Farey Sequence (欧拉函数)

    Farey Sequence 题意:给定一个数n,求在[1,n]这个范围内两两互质的数的个数.(转化为给定一个数n,比n小且与n互质的数的个数) 知识点: 欧拉函数: 普通求法: int Euler( ...

  9. 51Nod-1136 欧拉函数

    51Nod: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1136 1136 欧拉函数 基准时间限制:1 秒 空间限制: ...

随机推荐

  1. MySQL深入研究--学习总结(2)

    前言 接上文,继续学习后续章节. 第四章&第五章<深入浅出索引> 这两章节主要介绍的索引结构及其如何合理建立索引,但是我觉得讲的比较简单. 总结回顾下吧,其实在我之前的文章< ...

  2. CCF(消息传递口:80分):字符串相关+队列

    消息传递口 201903-4 本题主要是利用队列进行模拟,因为一开始我没有注意到要按照顺序,所以一开始的解法错误. #include<iostream> #include<algor ...

  3. C#中事件流程的简单理解

    C#中事件流程的简单理解 C#中事件基于委托,要理解事件要先理解委托,但是现在我还没想好怎么写委托,如果不懂委托可以先找找委托的文章 事件基于委托,为委托提供了一种发布/订阅机制 一上来就是这句话,很 ...

  4. Python爬虫系统化学习(5)

    Python爬虫系统化学习(5) 多线程爬虫,在之前的网络编程中,我学习过多线程socket进行单服务器对多客户端的连接,通过使用多线程编程,可以大大提升爬虫的效率. Python多线程爬虫主要由三部 ...

  5. SpringCloud里面切换数据源无效的问题

    问题描述: 调用链:controller1的接口A->service1的方法A->service2的方法B 方法A开启了事务,且指定了数据库A的数据源 方法B也开启了事务,使用了默认的事务 ...

  6. 建立高速缓存机制-java版

    前言 ​ 一台计算机的核心是CPU,它是计算机系统的运算和控制核心.由于它处理运算速度快,所以基本都会给CPU配置一级缓存,当CPU要读取一个数据时,首先从缓存中查询,如果没有在从内存或者磁盘块中找. ...

  7. 跨端开发技术 | 拼团商城项目同时开发app和小程序的要点

    此项目为拼团商城类型,主要功能包括商品分类.商品详情.商品搜索.拼团.订单管理等. 项目源码在 https://github.com/apicloudcom/group-ec 仓库的 widget 目 ...

  8. LayUi表单模块无法正常显示

    问题: 当我们再使用LayUI的Form表单模块时,我们会把自己需要的表单赋值到我们的页面中,但是会出现无法正常显示的问题,如下: 出现原因: LayUI官方文档也明确表示:"当你使用表单时 ...

  9. IgniteMe -高校网络信息安全运维挑战赛

    1 int __cdecl main(int argc, const char **argv, const char **envp) 2 { 3 void *v3; // eax 4 int v4; ...

  10. UML和设计模式原则总结

    UML总结: uml就是统一建模语言,包括语义概念 标记符号和指南 具有静态 动态 环境上的和组织性的部分 .它不是编程语言.uml预览它涉及的主要领域有结构性(静态视图,用例视图,构件图,实现视图, ...