内部题:T288284
思路
大模拟,先看文件关系数量,由于这个不允许少传或者多传,所以n!=8时直接把后面的输入吃掉然后输出no,随后dfs判断即可,练习时传上去RE了,事后补题。
代码
//标程
#include <bits/stdc++.h>
using namespace std;
bool check_root(string s){
bool ch = false, number = false;
for(int i = 0; i < s.size(); i++){
if(s[i] >= 'a' && s[i] <= 'z' || s[i] >= 'A' && s[i] <= 'Z'){
if(number) return false;
ch = true;
}else if(s[i] >= '0' && s[i] <= '9'){
if(!ch) return false;
number = true;
}else
return false;
}
return ch && number;
}
bool check_file(string fa, string s){
for(int i = 0; i < fa.size(); i++){
if(s[i] >= 'a' && s[i] <= 'z' || s[i] >= 'A' && s[i] <= 'Z');
else return false;
}
string now = fa + ".cpp";
return now == s;
}
map<string, int>id;
vector<int>G[21];
string inde[21];
int du[21], cnt = 0;
int getid(string s){
if(!id[s]){
id[s] = ++cnt;
inde[cnt] = s;
}
return id[s];
}
bool dfs(int now, int pre, int dep){
bool res = true;
if(dep == 1){
res &= check_root(inde[now]);
}else if(dep == 3){
res &= check_file(inde[pre], inde[now]);
}else if(dep > 3) return false;
if(dep == 1 && G[now].size() != 4) return false;
if(dep == 2 && G[now].size() != 1) return false;
for(int i = 0; i < G[now].size(); i++){
int nxt = G[now][i];
res &= dfs(nxt, now, dep + 1);
}
return res;
}
int main(){
int t, n;
cin >> t;
while(t--){
cin >> n;
memset(du, 0, sizeof du);
cnt = 0;
for(int i = 0; i < 21; i++)
G[i].clear();
id.clear();
string s1, s2;
for(int i = 1; i <= n; i++){
cin >> s1 >> s2;
int u = getid(s1);
int v = getid(s2);
G[u].push_back(v);
du[v]++;
}
bool flag = false, ans = true;
if(n != 8) ans = false;
for(int i = 1; i <= cnt; i++){
if(du[i] == 0 && !flag){
flag = true;
if(!dfs(i, 0, 1)) ans = false;
}else if(du[i] == 0){
ans = false;
}
}
if(ans) cout << "yes\n";
else cout << "no\n";
}
}