题目分析:

1. 一场双循环赛制的篮球赛,注意双循环,双循环!

2. 共有n只球队,两两之间有胜有负有平局;

3. 输入:

举例:

第一行:W:代表球队1打赢这只队伍

L:代表球队2没打赢这只队伍

因为两队伍有两场比赛,所以互相都可能打败对方;

如果A队打赢过B队,就连一条A到B的有向边;

建边时注意,如果A队 "L" B队,就连一条B->A边;(忘了这个wa了一发)

(这是坑点1,不是最可怕的)

4. 目的:

找到一条食物链:1 3 5 4 2;

代表:1赢过3,3赢过5,5赢过4,4赢过2,并且 2赢过1

要循环的;

解题思路:

1. 很明显dfs可以解决;如果A队打赢过B队,就连一条A到B的有向边;

(因为我很傻以为球队有很多只,怕超时,sb的用set写,其实这个二维数组建边就行了,不过两种写法差别不大,我就当作 是温习一下set的知识。结果被set一个坑点卡了一晚上,贼气,我在结尾说这个蛋疼的故事)

2. 减枝:状压一下吧(应该是叫状压吧?唉,我太菜了)

state[cur][i]表示状态cur的最后一步是i;

如果为1,代表这个不可行,continue掉;

题目链接:https://www.patest.cn/contests/gplt/L3-015

(怎么弄超链接,我真的不会)

AC代码如下:

#include<bits/stdc++.h>
#define test printf("***\n")
#define ka getchar();getchar()
#define ka1 getchar()
using namespace std;
typedef long long LL;
const int N = ;
const int M = ;
const int INF = 0x3f3f3f3f;
const LL mod = ;
const double eps=1e-;
int vis[N],ans[N];
int state[<<][N];//坑点1,状压处理
set<int> son[N];
char ar[N][N];
int flag,n;
void dfs(int u,int t,int cur){
if(flag)return;
for(set<int>::iterator p=son[u].begin();p!=son[u].end();++p){
int tmp=*p;
if(t==n){
if(tmp==ans[]){
flag=;
return;
}
continue;
}
if(vis[tmp]||state[cur|(<<tmp)][tmp])continue;
vis[tmp]=;
ans[t]=tmp;
dfs(tmp,t+,cur|(<<tmp));
if(flag)return;
state[cur|(<<tmp)][tmp]=;
vis[tmp]=;
}
}
int main(){
flag=;
scanf("%d",&n);
for(int i=;i<=n;++i){
son[i].clear();
}
for(int i=;i<n;++i){
scanf("%s",ar[i]);
for(int j=;j<n;++j){
if(ar[i][j]=='W'){
son[i].insert(j);
}
if(ar[i][j]=='L'){
son[j].insert(i);//坑点2,双循环赛制
}
}
}
memset(vis,,sizeof(vis));
vis[]=;
ans[]=;
dfs(,,);
if(flag==){
printf("No Solution\n");
return ;
}
for(int i=;i<n;++i){
if(i!=n-) printf("%d ",ans[i]+);
else printf("%d\n",ans[i]+);
}
return ;
}

(set遍历元素不是要先:set<int>::iterator 吗;然后我 set<int>::iterator p,把p作为全局变量,然后dfs找bug找一晚上,至于为什么不要设为全局变量,自己试一下就知道了)

(写完csdn再写博客园,真累)

PAT-L3-球队“食物链”-dfs-状压-set的更多相关文章

  1. POJ 1321 棋盘问题(DFS & 状压DP)

    用DFS写当然很简单了,8!的复杂度,16MS搞定. 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀. 状态转移分两种,当前行不加棋子,和加棋子.dp[i][j]中,i代表 ...

  2. Calculation(dfs+状压dp)

    Problem 1608 - Calculation Time Limit: 500MS   Memory Limit: 65536KB    Total Submit: 311  Accepted: ...

  3. CODEVS1358【DFS/状压DP】

    题目链接[http://codevs.cn/problem/1358/] 题意:这个游戏在一个有10*10个格子的棋盘上进行,初始时棋子位于左上角,终点为右下角,棋盘上每个格子内有一个0到9的数字,每 ...

  4. PAT L3-015. 球队“食物链”

    L3-015. 球队“食物链” 时间限制 1000 ms 内存限制 262144 kB 代码长度限制 8000 B 判题程序 Standard 作者 李文新(北京大学) 某国的足球联赛中有N支参赛球队 ...

  5. Atcoder Beginner Contest152F(DFS+状压DP)

    二维状压写成一维状压,省略加上第i条边这一维 #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace st ...

  6. UVALive 6255:Kingdoms(状压DFS)

    题目链接 题意 给出n个王国和n*n的矩阵,mp[i][j] 代表第 i 个王国欠第 j 个王国 mp[i][j] 块钱.如果当前的王国处于负债状态,那么这个王国就会被消除,和它相连的王国的债务都会被 ...

  7. 【62测试】【状压dp】【dfs序】【线段树】

    第一题: 给出一个长度不超过100只包含'B'和'R'的字符串,将其无限重复下去. 比如,BBRB则会形成 BBRBBBRBBBRB 现在给出一个区间[l,r]询问该区间内有多少个字符'B'(区间下标 ...

  8. BZOJ-1087 互不侵犯King 状压DP+DFS预处理

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...

  9. codeforces 285 D. Permutation Sum 状压 dfs打表

    题意: 如果有2个排列a,b,定义序列c为: c[i] = (a[i] + b[i] - 2) % n + 1 但是,明显c不一定是一个排列 现在,给出排列的长度n (1 <= n <= ...

  10. UVaLive 6625 Diagrams & Tableaux (状压DP 或者 DFS暴力)

    题意:给一个的格子图,有 n 行单元格,每行有a[i]个格子,要求往格子中填1~m的数字,要求每个数字大于等于左边的数字,大于上边的数字,问有多少种填充方法. 析:感觉像个DP,但是不会啊...就想暴 ...

随机推荐

  1. DM6446 uboot分析

    1. 顶层目录下的Makefile 按照配置顺序: davinci_config :    unconfig @./mkconfig $(@:_config=) arm arm926ejs davin ...

  2. Jenkins+Gradle实现android开发持续集成、打包

    Jenkins简介 Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上.同时 Jenkins 能实施监控集成中存在的错误, ...

  3. 工作中常用的linux命令(2)

    1.find :查找指定文件名的路径: 列出当前目录以及子目录中的所有文件: 在当前目录下寻找特定文件名的文件: 列出长度为零的文件: 2.ps :查看某个程序的进程,例如查询mongodb和mysq ...

  4. linux 时间和日期的设置

    Linux机器上的时间比较复杂,有各式各样的时钟和选项等等.机器里有两个时钟,硬件时钟从根本上讲是CMOS时钟,而系统时钟是由内核维护的. 1. 修改硬件时钟 (1)更新机器的硬件时间.命令为:hwc ...

  5. java.sql.SQLException:Column Index out of range,0<1

    1.错误描述 java.sql.SQLException:Column Index out of range,0<1 2.错误原因 try { Class.forName("com.m ...

  6. HDU5779 Tower Defence

    dp[i][j][k] 已选i个人 选到第j层 第j层有k个人 讨论相邻层  上一层选了l人 那么共有 两层之间的方案数 以及这一层自己的方案数 #include<bits/stdc++.h&g ...

  7. Entity Framework 乐观并发处理

    Entity Framework 乐观并发处理 有一段时间没有更新博客了,今天终于有一些时间,和大家讨论一个Entity Framework 乐观并发处理的问题.首先需要说明的是,这里提到的 “并发” ...

  8. link-cut-tree 简单介绍

    link-cut-tree 简单介绍 前言:这个算法似乎机房全都会,就我不会了TAT...强行搞了很久,勉强照着别人代码抄了一遍qwq 这个本人看论文实在看不懂,太菜了啊!!! 只好直接看如何实现.. ...

  9. 【BZOJ2882】工艺(后缀自动机)

    [BZOJ2882]工艺(后缀自动机) 题面 BZOJ权限题,良心洛谷 题解 还是一样的,先把串在后面接一遍 然后构建\(SAM\) 直接按照字典序输出\(n\)次就行了 #include<io ...

  10. (luogu P3358)最长k可重区间集问题 [TPLY]

    最长k可重区间集问题 题目链接 https://www.luogu.org/problemnew/show/3358 做法 所有点向下一个点连容量为k费用为0的边 l和r连容量为1费用为区间长度的边 ...