牛牛去牛市旅游

先看题目:https://ac.nowcoder.com/acm/problem/207754
题目描述:
牛牛参观景点,任意两个景点间都有路相连,牛牛希望经过某些路,为了参观完所有景点并且每个景点只参观一次,有多少种方法?
解题思路:
显然,如果A-B,B-C,C-A都要走即A、B、C成环了,那么A必然要经过两次,显然不行。这道题怎么考虑呢?举个例子试试:
图片说明
如图,
(1,2)要走,(4,5)要走,(6,7)要走,(7,8)要走,(7,9)要走
发现,如果某个点的度大于2,显然也是不行的,比如7无论如何都会经过2次
如果(7,9)这条边不存在,还是从1-9,我们来思考下总共有多少种方法?
把每个集合看成一个整体,那么整体上进行排序就是5!
然后每个集合都可以从左往右或从右往左(无向),这样的话就是2^3
故答案就是5!* 2^3种方法。
编程实现上,可以通过并查集来判断无向图的成环。详见:
https://blog.nowcoder.net/n/5ef13c1f51074a65815569d278dd63f9
并查集实现集合的合并查找等操作。
更多细节上的注意,见代码注释
代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1000000007;
char s[60];
int fa[60];
int num[60];

int found(int x)
{
    return fa[x] == x ? x : fa[x]=found(fa[x]);
}

int main()
{
    int n;
    ll ans = -1;
    scanf("%d",&n);
    for(int i = 1; i <= n; i++) {
        fa[i] = i;
    }
    for(int i = 1; i <= n; i++)
    {
        scanf("%s", s+1);
        int du = 0;
        for(int j = 1; j <= n; j++) {    //注意j是到n而不是j<i就结束了,因为要判断度,容易忘
            if(s[j] == 'Y') {
                if(++du > 2) ans = 0;
                if(i < j) {
                    if(found(i) == found(j)) ans = 0;
                    else fa[fa[i]] = fa[j];    //上面found已经路径压缩完了,因此可以这样写
                }
            }
        }
    }
    if(!ans)
        printf("0\n");
    else {
        ans = 1;
        int s = 0;
        for(int i = 1; i <= n; i++) {    //查找每个集合的元素个数,方法是:遍历一遍所有元素,每个元素都找到它的祖先,num[祖先]++    
            num[found(i)]++;
            if(fa[i] == i){
                s++;
            }
        }
        for(int i = 1; i <= s; i++) ans = ans * i % mod;
        for(int i = 1; i <= n; i++) {
            if(num[i] > 1) ans = ans * 2 % mod;
        }
        printf("%lld\n",ans);
    }
}
全部评论

相关推荐

哈哈哈,你是老六:百度去年裁员分评不好,赶紧弄点红包
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
8542次浏览 77人参与
# 你的实习产出是真实的还是包装的? #
1566次浏览 40人参与
# 米连集团26产品管培生项目 #
5469次浏览 213人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7307次浏览 40人参与
# 简历第一个项目做什么 #
31456次浏览 321人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186738次浏览 1118人参与
# MiniMax求职进展汇总 #
23638次浏览 305人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152219次浏览 887人参与
# 研究所笔面经互助 #
118829次浏览 577人参与
# 重来一次,我还会选择这个专业吗 #
433244次浏览 3926人参与
# 简历中的项目经历要怎么写? #
309873次浏览 4177人参与
# 面试紧张时你会有什么表现? #
30461次浏览 188人参与
# 你今年的平均薪资是多少? #
212936次浏览 1039人参与
# AI时代,哪些岗位最容易被淘汰 #
63209次浏览 791人参与
# 我的求职精神状态 #
447929次浏览 3128人参与
# 你最满意的offer薪资是哪家公司? #
76370次浏览 374人参与
# 正在春招的你,也参与了去年秋招吗? #
363068次浏览 2635人参与
# 你怎么看待AI面试 #
179715次浏览 1222人参与
# 牛客AI文生图 #
21391次浏览 237人参与
# 职能管理面试记录 #
10774次浏览 59人参与
# 网易游戏笔试 #
6438次浏览 83人参与
# 腾讯音乐求职进展汇总 #
160532次浏览 1109人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务