2 条题解

  • 0
    @ 2025-5-10 16:15:51

    解题思路如下:

    输入读取:循环读取输入,遇到“START”开始处理,读取起始点 s 和节点数 n。 数据处理:逐行读取输入,提取数字并统计边的数量,同时记录每个节点的度。 判断欧拉路径:遍历每个节点的度,判断是否为偶数。若除起始点和 0 号节点外的所有节点度为偶数,或者只有起始点和 0 号节点度为奇数,则可能存在欧拉路径。 结果输出:根据判断结果输出“YES”及边的总数,或“NO”。 // ShellDawn // POJ1300 // No.17

    #include<cstdio> 
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #define MM(x) memset(x,0,sizeof(x))
    using namespace std;
    
    int solve(const string& cc) {
        int L = cc.length();
        int ans = 0;
        for (int i = 0; i < L; i++) {
            ans *= 10;
            ans += cc[i] - '0';
        }
        return ans;
    }
    
    int main() {
        string a;
        while (cin >> a) {
            if (a == "START") {
                int s, n;
                cin >> s >> n;
                getchar();  // 吞掉START一行最后的回车
                int cnt[30];
                MM(cnt);
                int ans = 0;
                for (int i = 0; i < n; i++) {
                    char c;
                    string cc;
                    while ((c = getchar()) != '\n') {
                        if (c >= '0' && c <= '9') {
                            cc += c;
                        }
                        else {
                            cnt[solve(cc)]++;
                            cnt[i]++;
                            ans++;
                            cc = "";
                        }
                    }
                    if (cc != "") {
                        cnt[solve(cc)]++;
                        cnt[i]++;
                        cc = "";
                        ans++;
                    }
                }
                scanf("%*s");
                bool flag = true;
                bool flagflag = true;
                for (int i = 0; i < n; i++) {
                    if (cnt[i] % 2 == 0) {
                        continue;
                    }
                    else {
                        flagflag = false;
                        if (i == s || i == 0) continue;
                        else {
                            flag = false;
                        }
                    }
                }
                if ((flagflag && s == 0) || (!flagflag && flag)) {
                    printf("YES %d\n", ans);
                }
                else {
                    puts("NO");
                }
            }
            else {
                return 0;
            }
        }
        return 0;
    }
    • 0
      @ 2025-4-7 16:56:06

      解题思路如下:

      1. 输入读取:循环读取输入,遇到“START”开始处理,读取起始点 s 和节点数 n
      2. 数据处理:逐行读取输入,提取数字并统计边的数量,同时记录每个节点的度。
      3. 判断欧拉路径:遍历每个节点的度,判断是否为偶数。若除起始点和 0 号节点外的所有节点度为偶数,或者只有起始点和 0 号节点度为奇数,则可能存在欧拉路径。
      4. 结果输出:根据判断结果输出“YES”及边的总数,或“NO”。
      // ShellDawn
      // POJ1300
      // No.17
      
      #include<cstdio> 
      #include<iostream>
      #include<cstring>
      #include<algorithm>
      #define MM(x) memset(x,0,sizeof(x))
      using namespace std;
      
      int solve(const string& cc) {
          int L = cc.length();
          int ans = 0;
          for (int i = 0; i < L; i++) {
              ans *= 10;
              ans += cc[i] - '0';
          }
          return ans;
      }
      
      int main() {
          string a;
          while (cin >> a) {
              if (a == "START") {
                  int s, n;
                  cin >> s >> n;
                  getchar();  // 吞掉START一行最后的回车
                  int cnt[30];
                  MM(cnt);
                  int ans = 0;
                  for (int i = 0; i < n; i++) {
                      char c;
                      string cc;
                      while ((c = getchar()) != '\n') {
                          if (c >= '0' && c <= '9') {
                              cc += c;
                          }
                          else {
                              cnt[solve(cc)]++;
                              cnt[i]++;
                              ans++;
                              cc = "";
                          }
                      }
                      if (cc != "") {
                          cnt[solve(cc)]++;
                          cnt[i]++;
                          cc = "";
                          ans++;
                      }
                  }
                  scanf("%*s");
                  bool flag = true;
                  bool flagflag = true;
                  for (int i = 0; i < n; i++) {
                      if (cnt[i] % 2 == 0) {
                          continue;
                      }
                      else {
                          flagflag = false;
                          if (i == s || i == 0) continue;
                          else {
                              flag = false;
                          }
                      }
                  }
                  if ((flagflag && s == 0) || (!flagflag && flag)) {
                      printf("YES %d\n", ans);
                  }
                  else {
                      puts("NO");
                  }
              }
              else {
                  return 0;
              }
          }
          return 0;
      }
      • 1

      信息

      ID
      301
      时间
      1000ms
      内存
      256MiB
      难度
      9
      标签
      递交数
      13
      已通过
      2
      上传者