给出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. 两年内从零到每月十亿 PV 的发展来谈 Pinterest 的架构设计(转)

    原文:Scaling Pinterest - From 0 To 10s Of Billions Of Page Views A Month In Two Years 译文:两年内从零到每月十亿 PV ...

  2. POJ 2774 Long Long Message (后缀数组模板)

    借用罗大神的模板,开始搞后缀数组 #include <cstdio> #include <iostream> #include <cstring> #include ...

  3. js date string parse

    function dateParse(dStr){ //var dStr = '2016-1-26 0:7:14'; var d = dStr.split(' ')[0].split('-'); va ...

  4. Excel合并单元格数据

    1.=A1&B1 2.=CONCATENATE(A1,B1)

  5. 实现带查询功能的Combox控件

    前言 ComBox 还可以实现查询功能,通过设置 ComBox 控件的 AutoCompleteSource 属性和 AutoCompleteMode 属性,可以实现从 Combox 控件中查询已存在 ...

  6. (剑指Offer)面试题19:二叉树的镜像

    题目: 操作给定的二叉树,将其变换为源二叉树的镜像. 二叉树的定义如下: struct TreeNode{ int val; TreeNode* left; TreeNode* right; }; 输 ...

  7. flash 定义主舞台窗口大小

    1:[SWF(width=100 height=100)] 写在主类上面2:设置stageScaleMode属性为false;

  8. 1.单一职责原则(Single Responsibility Principle)

    1.定义 就一个类而言,应该仅有一个引起它变化的原因. 2.定义解读 这是六大原则中最简单的一种,通俗点说,就是不存在多个原因使得一个类发生变化,也就是一个类只负责一种职责的工作. 3.优点 类的复杂 ...

  9. CSS hack 和 IE浏览器条件判断 集中汇总

    (从死了一次又一次终于挂掉的百度空间中抢救出来的,发表日期 2014-08-16) 未完待续 css hack ie 浏览器判断语句 360大多数网页的各浏览器兼容方法: <!DOCTYPE h ...

  10. Windows常用性能计数器总结

    基础监控: Processor:% Processor Time CPU当前利用率,百分比 Memory:Available MBytes 当前可用内存,兆字节(虚拟内存不需要监控,只有当物理内存不够 ...