给出N行英雄的比较,每一行包含两个英雄的名字,代表第一个英雄比第二个英雄更受欢迎。

英雄的数目不超过16个。问有多少种可能的受欢迎程度的序列满足N行英雄的比较。

由于只有英雄数目不超过16个,可以用二进制来解决。

x的的位表示还有哪些点没有处理。在这些点中选择一个入度没零的点,求剩下的点可能排列的数目。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
using namespace std;
const int INF=0x5fffffff;
const double EXP=1e-;
const int MS=<<;
int edges[][];
int in[];
int base[];
int flag[MS];
char name[][];
int n,m; int ID(char *s)
{
for(int i=;i<n;i++)
{
if(!strcmp(name[i],s))
return i;
}
strcpy(name[n],s);
return n++;
} int find(int x) //x的二进制的位表示那些点还没有处理。
{
if(flag[x]>)
return flag[x];
for(int i=;i<n;i++)
{
if(in[i]==&&((x&base[i])==base[i]))
{
for(int j=;j<n;j++)
if(edges[i][j])
in[j]--;
flag[x]+=find(x^base[i]);// 去掉i点后,剩下的点有多少种可能
for(int j=;j<n;j++)
if(edges[i][j])
in[j]++;
}
}
return flag[x];
} int main()
{
char a[],b[];
for(int i=;i<;i++)
base[i]=<<i;
while(scanf("%d",&m)!=EOF)
{
n=; //顶点数量
int c,d;
memset(flag,,sizeof(flag));
memset(edges,,sizeof(edges));
memset(in,,sizeof(in));
for(int i=;i<m;i++)
{
scanf("%s%s",a,b);
c=ID(a);
d=ID(b);
edges[c][d]=;
in[d]++;
}
for(int i=;i<n;i++)
flag[base[i]]=;
int ans=find(base[n]-);
printf("%d\n",ans);
}
return ;
}

Comparing Your Heros拓扑序列的数量的更多相关文章

  1. 求拓扑排序的数量,例题 topcoder srm 654 div2 500

    周赛时遇到的一道比较有意思的题目: Problem Statement      There are N rooms in Maki's new house. The rooms are number ...

  2. SDUT-2140_判断给定图是否存在合法拓扑序列

    数据结构实验之图论十:判断给定图是否存在合法拓扑序列 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定一个有向图,判 ...

  3. 图结构练习——判断给定图是否存在合法拓扑序列(dfs算法(第一个代码),邻接矩阵(前两个代码),邻接表(第三个代码))

    sdut 2140 图结构练习——判断给定图是否存在合法拓扑序列 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  给定一个有向图 ...

  4. SDUT OJ 数据结构实验之图论十:判断给定图是否存在合法拓扑序列

    数据结构实验之图论十:判断给定图是否存在合法拓扑序列 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Prob ...

  5. Southern African 2001 框架折叠 (拓扑序列的应用)

    本文链接:http://www.cnblogs.com/Ash-ly/p/5398377.html 题目:考虑五个图片堆叠在一起,比如下面的9 * 8 的矩阵表示的是这些图片的边缘框. 现在上面的图片 ...

  6. SDUT2140图结构练习——判断给定图是否存在合法拓扑序列

    拓扑序列的判断方法为不存在有向环,代码实现的话有两种,一种是直接去判断是否存在环,较为难理解一些,另一种的话去判断结点入度,如果存在的入度为0的点大于一个,则该有向图肯定不存在一个确定的拓扑序列 #i ...

  7. acwing 848 有向图的拓扑序列

    地址 https://www.acwing.com/problem/content/description/850/ 题目描述给定一个n个点m条边的有向图,图中可能存在重边和自环. 请输出任意一个该有 ...

  8. (转)AS3正则:元子符,元序列,标志,数量表达符

    (转)AS3正则:元子符,元序列,标志,数量表达符: AS3正则:元子符,元序列,标志,数量表达符 七月 4th, 2010 归类于 AS3前端技术 作者Linkjun 进行评论 as3正则:元子符, ...

  9. Java实现蓝桥杯模拟正整数序列的数量

    问题描述 小明想知道,满足以下条件的正整数序列的数量: 1. 第一项为 n: 2. 第二项不超过 n: 3. 从第三项开始,每一项小于前两项的差的绝对值. 请计算,对于给定的 n,有多少种满足条件的序 ...

随机推荐

  1. (翻译)异步编程之Promise(1):初见魅力

    原文:https://www.promisejs.org/ by Forbes Lindesay 异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2) ...

  2. Mac 与 PC 键盘布局对比

  3. Android SDK Manager更新不了的解决办法

    android SDK Manager更新不了,出现错误提示:"Failed to fetch URL..."! 可以用以下办法解决: 使用SDK Manager更新时出现问题 F ...

  4. C# 特性详解(上)

    特性(attribute)是被指定给某一声明的一则附加的声明性信息. 元数据,就是C#中封装的一些类,无法修改.类成员的特性被称为元数据中的注释.     1.什么是特性 1)属性与特性的区别  属性 ...

  5. 圣杯VS双飞翼

    双飞翼: <!DOCTYPE html> <html> <head> <title>推荐封面</title> <meta name=& ...

  6. js 函数的传值问题

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  7. jQuery实现的瀑布流效果, 向下滚动即时加载内容

    下拉滚动条或鼠标滚轮滚动到页面底部时, 动态即时加载新内容. 后台用 json 传输数据, 示例程序中只写了示例数组.数据也只设置了两个属性, 需根据实际应用改写.   页面用了 ul li 做为容器 ...

  8. Cortex-M3 Context Switching

    http://www.embedded.com/design/embedded/4231326/Taking-advantage-of-the-Cortex-M3-s-pre-emptive-cont ...

  9. IE自动化 二(判断IP所在地)

    该脚本用来访问一个url,并取出相应结果(该脚本用来通过淘宝API实现判断一个IP所在地) #定义要访问的URL $url="http://ip.taobao.com/service/get ...

  10. radvd.conf RADVD配置文件内容部分解析

    interface eth0{ AdvSendAdvert on; #启用路由器公告(RA)功能 MinRtrAdvInterval ; #每隔30-100秒间隔发送公告消息 MaxRtrAdvInt ...