【团体程序设计天梯赛-练习集L3-015】球队“食物链”【状压dp+路径记录】

题意:

    找一个环,满足相邻的前一个胜过后一个,输出答案序列,如果有多个答案,输出字典序最小的方案

题解:

    首先,如果有答案的话,方案中1肯定是在第一个(因为答案是个环

    最多有20个点,状压dp很好想到,这是最简单的了差不多,dp[s][i]代表以i为结尾的状态s能否被达到,把dp[1][1]初始化为1

    难点是路径的记录,我是这样处理的,在记录正向边的时候,用pre[i]记录那些点能够到达i的点(也就是方向边),然后从后面的状态开始,把满足条件的dp[1<

#include
#include
using namespace std;
#define PB push_back
const int N=25;
const int M=2e6+10;
int f[M];
int n;
char mp[N][N];
vectorG[N],pre[N];
int dp[M][N];
bool vis[N][N],mark[M][N],ok[N][N][N];
int main()
{
    for(int i=0;i1;i--){
            for(int j=1;j<=n;j++)if(mark[i][j]){
                int d=i^(1<<(j-1));
                for(int k=0;k


你可能感兴趣的:(ACM)