对于水题的疑问可能放在学术版不合适?
题意:给出一个每个节点的度均为偶数的连通无向图,找到字典序最小的一笔画方式。
一个 AC:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, x, y, st[100005], cnt;
bool vis[50005];
vector<pair<int,int> > v[50005];
void dfs(int id)
{
for (pair<int,int> i : v[id])
{
if (vis[i.second])
{
continue;
}
vis[i.second] = 1;
cnt++;
dfs(i.first);
}
st[++st[0]] = id; // 放后面
}
signed main()
{
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
cin >> x >> y;
v[x].emplace_back(y,i);
v[y].emplace_back(x,i);
}
for (int i = 1; i <= n; i++)
{
sort(v[i].begin(), v[i].end());
}
dfs(1);
for (int i = st[0]; i >= 1; i--) // 当然,输出也要反向
{
cout << st[i] << " ";
}
return 0;
}
这个是 WA(但不全 WA,小样例能过):
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, x, y, st[100005], cnt;
bool vis[50005];
vector<pair<int,int> > v[50005];
void dfs(int id)
{
st[++st[0]] = id; // 放前面
for (pair<int,int> i : v[id])
{
if (vis[i.second])
{
continue;
}
vis[i.second] = 1;
cnt++;
dfs(i.first);
}
}
signed main()
{
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
cin >> x >> y;
v[x].emplace_back(y,i);
v[y].emplace_back(x,i);
}
for (int i = 1; i <= n; i++)
{
sort(v[i].begin(), v[i].end());
}
dfs(1);
for (int i = 1; i <= st[0]; i++) // 正向输出
{
cout << st[i] << " ";
}
return 0;
}
求 hack!