某国的足球联赛中有N支参赛球队,编号从1至N。联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场。

联赛战罢,结果已经尘埃落定。此时,联赛主席突发奇想,希望从中找出一条包含所有球队的“食物链”,来说明联赛的精彩程度。“食物链”为一个1至N的排列{ T1 T2 ... TN },满足:球队T1战胜过球队T2,球队T2战胜过球队T3,……,球队T(N-1)战胜过球队TN,球队TN战胜过球队T1

现在主席请你从联赛结果中找出“食物链”。若存在多条“食物链”,请找出字典序最小的。

注:排列{ a1 a2 ...aN }在字典序上小于排列{ b1 b2 ... bN },当且仅当存在整数K(1 <= K <= N),满足:aK < bK且对于任意小于K的正整数i,ai=bi

输入格式:

输入第一行给出一个整数N(2 <= N <= 20),为参赛球队数。随后N行,每行N个字符,给出了NxN的联赛结果表,其中第i行第j列的字符为球队i在主场对阵球队j的比赛结果:“W”表示球队i战胜球队j,“L”表示球队i负于球队j,“D”表示两队打平,“-”表示无效(当i=j时)。输入中无多余空格。

输出格式:

按题目要求找到“食物链”T1 T2 ... TN,将这N个数依次输出在一行上,数字间以1个空格分隔,行的首尾不得有多余空格。若不存在“食物链”,输出“No Solution”。

输入样例1:

5
-LWDW
W-LDW
WW-LW
DWW-W
DDLW-

输出样例1:

1 3 5 4 2

输入样例2:

5
-WDDW
D-DWL
DD-DW
DDW-D
DDDD-

输出样例2:

No Solution

八分的测试点总是超时,然后就改成邻接表,还是超时,学习了别人的方法,dfs到一个位置,可以查看如果剩下没访问的点都没有赢过第一个点的话,就返回,因为继续dfs下去没意义。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
char s[];
int ss[];
int n,visited[];
int u[],v[],fir[],nex[],c,mp[][];
int flag;
int print()
{
printf("%d",ss[]);
for(int i = ;i < n;i ++)
{
printf(" %d",ss[i]);
}
}
void dfs(int k,int t)
{
if(flag)return;
if(t == n)
{
if(mp[ss[n - ]][ss[]])
{
flag = ;
print();
}
return;
}
int c = ;
for(int i = ;i <= n;i ++)
{
if(!visited[i] && mp[i][ss[]])c ++;
}
if(!c)return;
int a = fir[k];
while(a != -)
{
if(flag)return;
if(!visited[v[a]])
{
visited[v[a]] = ;
ss[t] = v[a];
dfs(v[a],t + );
visited[v[a]] = ;
}
a = nex[a];
}
}
int main()
{
scanf("%d",&n);
memset(fir,-,sizeof(fir));
for(int i = ;i < n;i ++)
{
scanf("%s",s);
for(int j = n - ;j >= ;j --)
{
if(s[j] == 'W')
{
mp[i + ][j + ] = ;
}
else if(s[j] == 'L')
{
mp[j + ][i + ] = ;
}
}
}
for(int i = ;i <= n;i ++)
{
for(int j = n;j >= ;j --)
{
if(mp[i][j])
{
u[c] = i;
v[c] = j;
nex[c] = fir[u[c]];
fir[u[c]] = c ++;
}
}
}
for(int i = ;i <= n;i ++)
{
if(!flag)
{
ss[] = i;
visited[i] = ;
dfs(i,);
visited[i] = ;
}
else break;
}
if(!flag)puts("No Solution");
}

思维要灵活,得会剪枝。。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <map>
#include <algorithm>
#define inf 0x3f3f3f3f
using namespace std;
char s[][];
bool vis[],al[];
int n,all;
vector<int> ans,tans;
vector<int> Next[];
void dfs(int k) {
if(!ans.empty() || tans.size() < n && all == ) return;
if(tans.size() == n) {
if(s[k][] == 'W' || s[][k] == 'L') {
ans = tans;
}
return;
}
for(int i = ;i < Next[k].size();i ++) {
if(!ans.empty()) return;
if(!vis[Next[k][i]]) {
tans.push_back(Next[k][i]);
all -= al[Next[k][i]];
vis[Next[k][i]] = ;
dfs(Next[k][i]);
vis[Next[k][i]] = ;
all += al[Next[k][i]];
tans.pop_back();
}
}
}
int main() {
scanf("%d",&n);
int flag = ;
for(int i = ;i <= n;i ++) {
scanf("%s",s[i] + );
for(int j = ;j <= n;j ++) {
if(s[i][j] == 'W') {
Next[i].push_back(j);
}
else if(s[i][j] == 'L') {
Next[j].push_back(i);
}
}
}
for(int i = ;i <= n;i ++) {
if(s[i][] == 'W' || s[][i] == 'L') {
all ++;
al[i] = true;
}
if(Next[i].empty()) flag = ;
sort(Next[i].begin(),Next[i].end());
}
tans.push_back();
vis[] = ;
if(flag) dfs();
if(ans.empty()) {
printf("No Solution");
}
else {
for(int i = ;i < n;i ++) {
if(i) putchar(' ');
printf("%d",ans[i]);
}
}
}

L3-015. 球队“食物链”的更多相关文章

  1. L3-015 球队“食物链” (30 分)

    L3-015 球队“食物链” (30 分)   某国的足球联赛中有N支参赛球队,编号从1至N.联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场. 联赛战罢,结果已经尘埃落定.此时,联赛主席 ...

  2. L3-015. 球队“食物链”(dfs)

    L3-015. 球队“食物链” 某国的足球联赛中有N支参赛球队,编号从1至N.联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场. 联赛战罢,结果已经尘埃落定.此时,联赛主席突发奇想,希望从 ...

  3. pat 团体天梯赛 L3-015. 球队“食物链”

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

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

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

  5. 【搜索-剪枝-偏难】PAT-天梯赛-L3-015. 球队“食物链”

    L3-015. 球队“食物链” 某国的足球联赛中有N支参赛球队,编号从1至N.联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场. 联赛战罢,结果已经尘埃落定.此时,联赛主席突发奇想,希望从 ...

  6. L3-015. 球队“食物链”【DFS + 剪枝】

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

  7. 球队“食物链”(DFS+剪枝)

    某国的足球联赛中有N支参赛球队,编号从1至N.联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场. 联赛战罢,结果已经尘埃落定.此时,联赛主席突发奇想,希望从中找出一条包含所有球队的“食物链 ...

  8. CCCC L3-015. 球队“食物链”(dfs+剪枝)

    题意: 某国的足球联赛中有N支参赛球队,编号从1至N.联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场. 联赛战罢,结果已经尘埃落定.此时,联赛主席突发奇想,希望从中找出一条包含所有球队的 ...

  9. PAT 天梯赛 【】 L3-015. 球队“食物链” 【BFS+剪枝】

    题目链接 https://www.patest.cn/contests/gplt/L3-015 思路 用一个 数组标记 胜负 每次输入一行字符串 然后遍历 如果 碰到 W 那么 vis[i][j] = ...

随机推荐

  1. java统计文档中相同字符出现次数(超详细)

    public class test { public static void main(String[] args) throws Exception { InputStream file = new ...

  2. Base64工具类并发问题!

    为减少对象创建次数,一般会做如下编码: public class EncodeUtils { private static BASE64Encoder encoder; private static ...

  3. C# 自定义集合类

    .NET中提供了一种称为集合的类型,类似于数组,将一组类型化对象组合在一起,可通过遍历获取其中的每一个元素 本篇记录一个自定义集合的小实例.自定义集合需要通过实现System.Collections命 ...

  4. shims-vue.d.ts 解析

    TypeScript的文档看起来比较让人匪夷所思 TS是从2012年就开始的项目,那时ES6的模块化还没有成为继定标准,所以今天来看TS中一些名词让人匪夷所思,其实都是历史遗留问题 比如namespa ...

  5. 测开之路一百五十四:ajax+json前后台数据交互

    在实际工作中,前后端数据交互大部分都是用的json格式,后端把数据处理完后,把json传给前端,前端再解析 项目结构 models里面加入把数据转为字典的方法 from datetime import ...

  6. Python学习之==>发送邮件

    自动化测试执行完成后,需要自动发送测试报告.Python发送邮件可以使用smtplib标准模块,但该模块比较繁琐,推荐使用yagmail这个第三方模块,用法比较简单. 一.邮箱设置 1.在邮箱设置里打 ...

  7. HTML真是好东西!

    HTML真是好东西! 学习HTML已经两天了,别小看这两天哦,这短短的两天估计要比学校的四周还要长.不仅有教学,还有同学与老师之间的交流,最重要的是自己上机实践的过程.在这个过程中,不仅知道了在HTM ...

  8. Android专项测试监控资源

    版本号 V 1.1.0 Android性能测试分为两类:1.一类为rom版本(系统)的性能测试2.一类为应用app的性能测试(本次主要关注点为app的性能测试) Android的app性能测试包括的测 ...

  9. Chapter03 第二节 const限定符的使用

    3.2 const限定符 const的作用:替代#define作为有类型检查的常量来使用.他的值被初始化后就固定了,成为一个只读变量,不能更改.(推荐使用特殊的命名规范来区分常量和非常量). cons ...

  10. python+selenium下载文件——firefox

    修改Firefox的相关配置. 1.profile.set_preference('browser.download.folderList',2) 设置成0代表桌面,1代表下载到浏览器默认下载路径:2 ...