10129 - Play on Words (UVA)

题目链接如下:

Online Judge

欧拉道路的题。

有向图满足欧拉道路有两个条件:1,图是连通的(无向边意义上);2,最多只能有两个点的出度不等于入度,而且其中一个点的出度比入度大1,一个点的入度比出度大1.

连通是在无向边意义上连通,所以第16行需要 mat[k][i] || mat[i][k] ,只要单方向有路,就算连通。(一个测试数据:

msm

mac

csd

dsa

asd

如果 mat[k][i] || mat[i][k] 写成 mat[k][i] ,这组数据答案会有问题。

我的代码如下:

cpp 复制代码
#include <iostream>
#include <string>
#include <algorithm>
#include <map>
// #define debug

int T, N;
std::string str;
int degree[26];
int mat[26][26];
int visited[26];

void dfs(int k){
    visited[k] = 0;
    for (int i = 0; i < 26; ++i){
        if (visited[i] && (mat[k][i] || mat[i][k])){
            dfs(i);
        }
    }
}

int main(){
    #ifdef debug
    freopen("0.txt", "r", stdin);
    freopen("1.txt", "w", stdout);
    #endif
    scanf("%d", &T);
    while (T--){
        std::fill(degree, degree + 26, 0);
        std::fill(mat[0], mat[0] + 26 * 26, 0);
        std::fill(visited, visited + 26, 0);
        scanf("%d", &N);
        while (N--){
            std::cin >> str;
            degree[str[0] - 'a']++;
            degree[str.back() - 'a']--;
            mat[str[0] - 'a'][str.back() - 'a']++;
            visited[str[0] - 'a'] = 1;
            visited[str.back() - 'a'] = 1;
        }
        std::map<int, int> mp;
        bool flag = true;
        for (int i = 0; i < 26; ++i){
            if (degree[i] < -1 || degree[i] > 1){
                flag = false;
                break;
            }
            if (degree[i] == -1){
                mp[-1]++;
            } else if (degree[i] == 1){
                mp[1]++;
            }
        }
        if (!flag || mp[-1] > 1 || mp[1] > 1 || mp[-1] != mp[1]){
            printf("The door cannot be opened.\n");
            continue;
        }
        int cnt = 0;
        for (int i = 0; i < 26; ++i){
            if (visited[i]){
                cnt++;
                dfs(i);
            }
        }
        if (cnt == 1){
            printf("Ordering is possible.\n");
        } else {
            printf("The door cannot be opened.\n");
        }
    }
    #ifdef debug
    fclose(stdin);
    fclose(stdout);
    #endif
    return 0;
}
相关推荐
慕容青峰30 分钟前
【LeetCode 1925. 统计平方和三元组的数目 题解】
c++·算法·leetcode
冰西瓜60032 分钟前
动态规划(一)算法设计与分析 国科大
算法·动态规划
TL滕37 分钟前
从0开始学算法——第十一天(字符串基础算法)
笔记·学习·算法
roman_日积跬步-终至千里1 小时前
【计算机算法与设计(10)】习题:苹果买卖问题——分治法的经典应用
算法
deepdata_cn1 小时前
模型预测控制(MPC)算法
算法
独自破碎E1 小时前
如何用最短替换让字符串变平衡?
java·开发语言·算法·leetcode
Jasmine_llq2 小时前
《P1082 [NOIP 2012 提高组] 同余方程》
算法·数学建模·质因数分解(试除法)·快速幂(模幂运算)·欧拉函数计算·基于质因数分解
算家计算2 小时前
AI真的懂你!阿里发布Qwen3-Omni-Flash 全模态大模型:超强交互,人设任选
人工智能·算法·机器学习
l1t2 小时前
利用Duckdb求解Advent of Code 2025第9题 最大矩形面积
数据库·sql·算法·duckdb·advent of code
Swift社区2 小时前
LeetCode 446 - 等差数列划分 II - 子序列
算法·leetcode·职场和发展