本题是UVa10441 洛谷是单组数据版本,我的代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
using namespace std;
const int maxn = 30;
int ss, m, deg[maxn], cnt[2], head[maxn];
bool vis[maxn];
vector<string> edge[maxn];
stack<string> st;
int p[maxn];
int find(int x)//并查集
{return p[x] == x ? x : p[x] = find(p[x]);}
void merge(int u, int v)//并
{
u = find(u), v = find(v);
p[u] = v;
}
bool same(int u, int v)//查
{return find(u) == find(v);}
void dfs(const string &s)
{
int u = s[s.size() - 1] - 'a';
for(int i = head[u]; i < (int)edge[u].size(); i = head[u])
{
head[u]++;
dfs(edge[u][i]);
}
st.push(s);
}
int main()
{
cin >> m;
string s;
while(m--)
{
cin >> s;
int u = s[0] - 'a', v = s.back() - 'a';
edge[u].push_back(s);
deg[u]++, deg[v]--;
if(!vis[u])
{
p[u] = u;
vis[u] = 1;
ss++;
}
if(!vis[v])
{
p[v] = v;
vis[v] = 1;
ss++;
}
if(!same(u, v))
{
merge(u, v);
ss--;
}
}
int S = -1;
bool flag = 1;
for(int u = 0; u < 26 && ss == 1; u++)
{
if(!deg[u])
continue;
else if(deg[u] == 1)
{
S = u;
if(++cnt[0] > 1)
break;
}
else if(deg[u] == -1)
{
if(++cnt[1] > 1)
break;
}
else
{
flag = 0;
break;
}
}
if(ss != 1 || !flag || cnt[0] > 1 || cnt[1] > 1)
{
cout << "***";
return 0;
}
for(int u = 0; u < 26; u++)
sort(edge[u].begin(), edge[u].end());
if(S == -1)
{
for(int u = 0; u < 26; u++)
if(!edge[u].empty())
{
S = u;
break;
}
}
s = edge[S][0];
head[S] = 1;
dfs(s);
cout << st.top();
st.pop();
while(!st.empty())
{
cout << '.' << st.top();
st.pop();
}
return 0;
}
UVa是多组数据的版本,我改成多组数据之后(可AC)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
#include <cstring>
using namespace std;
const int maxn = 30;
int ss, m, deg[maxn], cnt[2], head[maxn];
bool vis[maxn];
vector<string> edge[maxn];
stack<string> st;
int p[maxn];
int find(int x)//并查集
{return p[x] == x ? x : p[x] = find(p[x]);}
void merge(int u, int v)//并
{
u = find(u), v = find(v);
p[u] = v;
}
bool same(int u, int v)//查
{return find(u) == find(v);}
void dfs(const string &s)
{
int u = s[s.size() - 1] - 'a';
for(int i = head[u]; i < (int)edge[u].size(); i = head[u])
{
head[u]++;
dfs(edge[u][i]);
}
st.push(s);
}
void init()
{
ss = 0;
memset(deg, 0, sizeof deg);
cnt[0] = cnt[1] = 0;
memset(head, 0, sizeof head);
memset(vis, 0, sizeof vis);
for(int u = 0; u < 26; u++)
edge[u].clear();
}
int main()
{
int T;
cin >> T;
while(T--)
{
init();
string s;
cin >> m;
while(m--)
{
cin >> s;
int u = s[0] - 'a', v = s.back() - 'a';
edge[u].push_back(s);
deg[u]++, deg[v]--;
if(!vis[u])
{
p[u] = u;
vis[u] = 1;
ss++;
}
if(!vis[v])
{
p[v] = v;
vis[v] = 1;
ss++;
}
if(!same(u, v))
{
merge(u, v);
ss--;
}
}
int S = -1;
bool flag = 1;
for(int u = 0; u < 26 && ss == 1; u++)
{
if(!deg[u])
continue;
else if(deg[u] == 1)
{
S = u;
if(++cnt[0] > 1)
break;
}
else if(deg[u] == -1)
{
if(++cnt[1] > 1)
break;
}
else
{
flag = 0;
break;
}
}
if(ss != 1 || !flag || cnt[0] > 1 || cnt[1] > 1)
{
cout << "***" << endl;
continue;
}
for(int u = 0; u < 26; u++)
sort(edge[u].begin(), edge[u].end());
if(S == -1)
{
for(int u = 0; u < 26; u++)
if(!edge[u].empty())
{
S = u;
break;
}
}
s = edge[S][0];
head[S] = 1;
dfs(s);
cout << st.top();
st.pop();
while(!st.empty())
{
cout << '.' << st.top();
st.pop();
}
cout << endl;
}
return 0;
}
大佬可以看看我哪里出了问题么...脑壳疼。。。或者教教我怎么对拍,我自己写的对拍数据生成器,跑了很久都没有对出来。。
```cpp
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int n = 26;
int ind[30], oud[30], m;
int main()
{
srand(time(0));
for(int u = 0; u < n; u++)
oud[u] = ind[u] = rand() % 5, m += ind[u];
int cnt = rand() % 3;
m += cnt;
while(cnt--)
{
int u = rand() % 26, v = rand() % 26;
oud[u]++;
ind[v]++;
}
printf("%d\n", m);
while(m)
{
int u = rand() % 26, v = rand() % 26;
if(oud[u] && ind[v])
{
printf("%c%c\n", u + 'a', v + 'a');
oud[u]--;
ind[v]--;
m--;
}
}
return 0;
}