【题解】青石巷-一笔画

我就知道一定会有小可爱用图论算法做……
跑一边,确定是不是图。
没问题的,但是一开始我的数据范围写的是\(10^6\),这个好像对图不太友好。
有没有O(n)的做法呢?有!
一笔画的性质:如果这个图中有0或2个奇数点(被奇数个线连接),那么他可以一笔画。
OK,于是有了这个代码:

#include<bits/stdc++.h>
using namespace std;
int n[1001],m[1001],v[1001];
int main(){
    int a,b,c;
    cin >> a >> b;
    for(int i = 0;i < b;i ++){
        cin >> n[i] >> m[i];
        v[n[i]] ++ ;
        v[m[i]] ++ ;
    }
    for(int i = 0;i < b;i ++){
        if(v[i] % 2 != 0){
            c++;
        }
    }
    if(c == 0 || c == 2) cout << "\"LTF CSL\"";
    else cout << "\"LTF TSL\"";
}

\(AC\)了,大概4ms。
还能不能更快?当然可以:

#include<bits/stdc++.h>
using namespace std;
int n[1001],m[1001],v[1001];
int main(){
    int a,b,c;
    cin >> a >> b;
    for(int i = 0;i < b;i ++){
        cin >> n[i] >> m[i];
        v[n[i]] ++ ;
        v[m[i]] ++ ;
    }
    for(int i = 0;i < b;i ++){
        if(v[i] % 2 != 0){
            c++;
        }
        if(c > 2){//大于2直接输出然后return 0
            cout << "\"LTF TSL\"";return 0;
        }
    }cout << "\"LTF CSL\""; 
}

这里再给一个D语言版本:

import std.stdio
int[1001] n,m,v;
int main(string[] args){
    int a,b,c;
    readf("%d%d",&a,&b);
    for(int i = 0;i < b;i ++){
        readf("%d%d",&n[i],&m[i]);
        v[n[i]] ++ ;
        v[m[i]] ++ ;
    }
    for(int i = 0;i < b;i ++){
        if(v[i] % 2 != 0){
            c++;
        }
        if(c > 2){//大于2直接输出然后return 0
            write("\"LTF TSL\"");return 0;
        }
    }
    write("\"LTF CSL\""); 
    return 0;
}
posted @ 2020-03-16 15:23  SD!LTF  阅读(121)  评论(1编辑  收藏  举报