欧拉道路的题。dfs对每个连通块记录奇点个数odd,同时记录下没有奇点的连通块的数目s,那么所有有奇点的连通块连成一整个的欧拉道路需要另外经过odd/2-1条边。同时加上这个大连通块与另外s个连通块之间连通需要的s条道路再加上原本需要经过的E条道路就是最终答案。比较坑的一点是E可能为0.。。。。所以这里odd/2-1+s有可能得到-1.。。所以最终我们的答案应该是E+max(odd/2-1+s,0)。AC代码如下
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
struct Edge
{
int from,to;
Edge();
Edge(int f,int t): from(f),to(t){}
};
vector<Edge> edges;
vector<int> G[1001];
set<int> p;
int vis[1001];
int odd=0;
void add_edge(int u,int v)
{
edges.push_back(Edge(u,v));
int m=edges.size();
G[u].push_back(m-1);
}
void dfs(int u)
{
vis[u]=1;
if((int)G[u].size()%2==1)
odd++;
for(int j=0;j<G[u].size();j++)
{
int v=edges[G[u][j]].to;
if(!vis[v])
dfs(v);
}
}
int main()
{
int V,E,T,cnt=0;
while(scanf("%d %d %d", &V, &E, &am