【题解】青石巷-一笔画
我就知道一定会有小可爱用图论
算法做……
跑一边,确定是不是图。
没问题的,但是一开始我的数据范围写的是\(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;
}