D. A Simple Task

news/2025/3/28 8:23:13/

Problem - D - Codeforces

思路:这个题就是求环的数量,通过数据范围的大小,我们可以想到用状压dp来做,因为只有19个点,我们可以将环的路径进行状态压缩,用一个二进制数表示环,当某一位为1时表示这个点在环上,那么我们可以用f[i][j]表示当前的路径状态为i,当前所在的点为j的情况,为了让环不重复统计,那么我们可以将路径中最小的点作为起点,可以保证不重复,那么我们只需要将状态从小到大枚举,这样一定会枚举到所有的情况,因为i一定是变大的不会变小,然后再枚举现在再哪个位置了,再枚举接下来要走到哪个点,那么如果当前的位置或者要到的位置比起点的编号小了,那么就跳过,并且如果从当前位置不能够走到下一个位置也跳过,并且我们再更新i的过程中要保证路径i没有环,因为如果存在环会重复统计。       

// Problem: D. A Simple Task
// Contest: Codeforces - Codeforces Beta Round 11
// URL: https://codeforces.com/contest/11/problem/D
// Memory Limit: 256 MB
// Time Limit: 2000 ms#include<bits/stdc++.h>
#include<sstream>
#include<cassert>
#define fi first
#define se second
#define i128 __int128
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> PII;
const double eps=1e-7;
const int N=5e5+7 ,M=5e5+7, INF=0x3f3f3f3f,mod=1e9+7,mod1=998244353;
const long long int llINF=0x3f3f3f3f3f3f3f3f;
inline ll read() {ll x=0,f=1;char c=getchar();while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(ll)x*10+c-'0';c=getchar();} return x*f;}
inline void write(ll x) {if(x < 0) {putchar('-'); x = -x;}if(x >= 10) write(x / 10);putchar(x % 10 + '0');}
inline void write(ll x,char ch) {write(x);putchar(ch);}
void stin() {freopen("in_put.txt","r",stdin);freopen("my_out_put.txt","w",stdout);}
bool cmp0(int a,int b) {return a>b;}
template<typename T> T gcd(T a,T b) {return b==0?a:gcd(b,a%b);}
template<typename T> T lcm(T a,T b) {return a*b/gcd(a,b);}
void hack() {printf("\n----------------------------------\n");}int T,hackT;
int n,m,k;
bool st[30][30];
ll f[1<<20][20];int lowbit(int x) {return x&-x;
}void solve() {n=read(),m=read();for(int i=1;i<=m;i++) {int a=read(),b=read();st[a-1][b-1]=st[b-1][a-1]=true;}	for(int i=0;i<n;i++) f[1<<i][i]=1;ll res=0;for(int i=0;i<(1<<n);i++) {int start=lowbit(i);for(int j=0;j<n;j++) {if((1<<j)<start) continue;for(int k=0;k<n;k++) {if((1<<k)<start) continue;if(!st[j][k]) continue;if(start==(1<<k)) {res+=f[i][j];}else if(!((i>>k)&1)){f[i|(1<<k)][k]+=f[i][j];}}}}res=(res-m)/2;printf("%lld\n",res);
}int main() {// init();// stin();// ios::sync_with_stdio(false); // scanf("%d",&T);T=1; while(T--) hackT++,solve();return 0;       
}          


http://www.ppmy.cn/news/1127195.html

相关文章

Vue3最佳实践 第五章 Vue 组件应用 5 (Vue 插件)

想了解Vue插件所以你看了官方文档却看不懂&#xff0c;或者你想知道Vue.use()方法和插件的关系。在本文档中&#xff0c;我们将参照文档讲解插件制作的基础知识&#xff0c;了解基础知识后&#xff0c;我们将制作与更实用的下拉菜单和脚本加载相关的插件。读完之后&#xff0c;…

基于springboot高校场馆预订系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

PHP 变动:PHP 8 版本下字符串与数值的弱比较

文章目录 参考环境声明弱比较隐式类型转换字符串连接数学运算布尔判断相等运算符 字符串与数值的弱比较字符串转化为数值的具体规则字符串与数值的弱比较一般情况科学计数法前缀 0E 与 0e PHP8 在字符串与数值的弱比较方面做出的改动数值字符串优化 参考 项目描述搜索引擎Bing…

Qt-键盘消息的传递-键盘消息的获取-C++

文章目录 1.概述2.焦点3.强制获取键盘消息4.键盘常用组合方法5.总结 1.概述 QKeyEvent 类用来描述一个键盘事件。当键盘按键被按下或者被释放时&#xff0c;键盘事件便会被发送给拥有键盘输人焦点的部件。 QKeyEvent 的 key() 函数可以获取具体的按键&#xff0c;对于 Qt 中给…

知识分享 钡铼网关功能介绍:使用SSLTLS 加密,保证MQTT通信安全

背景 为了使不同的设备或系统能够相互通信&#xff0c;让旧有系统和新的系统可以集成&#xff0c;通信更加灵活和可靠。以及将数据从不同的来源收集并传输到不同的目的地&#xff0c;实现数据的集中管理和分发。 通信网关完美克服了这一难题&#xff0c;485或者网口的设备能通过…

mysql大数据量 分页查询优化

最近我老表问我一个面试问题&#xff0c;如果数据量很大&#xff0c;分页查询怎么优化。 个人觉得无非就是sql优化&#xff0c; 那无非就是走索引&#xff0c; 避免回表查询&#xff08;覆盖索引&#xff0c;也就是不要用select * &#xff0c;走主键索引&#xff0c;叶子节点有…

蓝桥杯2023年第十四届省赛真题-异或和之和--题解

目录 蓝桥杯2023年第十四届省赛真题-异或和之和 题目描述 输入格式 输出格式 样例输入 样例输出 【代码实现】 大家觉得写得可以的话&#xff0c;可以加入QQ群907575059. 蓝桥杯2023年第十四届省赛真题-异或和之和 时间限制: 3s 内存限制: 320MB 提交: 241 解决: 66 …

手机自动直播系统源码交付与代理加盟注意事项解析!

随着直播行业的不断发展&#xff0c;手机自动直播已经成为了人们生活中不可或缺的一部分。手机无人直播软件成了香饽饽&#xff0c;各类手机实景直播APP大批量涌现。因为创业和技术门槛低&#xff0c;市场需求高&#xff0c;所以成了最火热创业赛道。那么如果是不懂技术的人群&…