欧拉道路存在的条件:1、最多只能有两个度数为奇数的结点 2、图是连通的
注意特殊判断E=0情况
#include<iostream>
#include<string>
#include<cassert>
#include<algorithm>
#include<map>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
const int maxn = 1000+20;
set<int>edge[maxn];
int vis[maxn];
set<int>vtovis;
int id;
int V, E, T;
void dfs(int elem, int id,int &cnt)
{
if (edge[elem].size() % 2 != 0)
++cnt;
vis[elem] = id;
for (int i = 1; i <= V; ++i)
{
if (edge[elem].find(i) != edge[elem].end() && vis[i] == 0)
dfs(i, id, cnt);
}
}
int main()
{
//freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
int kase = 1;
while (cin >> V >> E >> T && (V != 0 || E != 0 || T != 0))
{
int add = 0;
cout << "Case " << kase++ << ": ";
id = 0;
vtovis.clear();
memset(vis, 0, sizeof(vis));
for (int i = 0; i <= V; ++i)
edge[i].clear();
for (int i = 0; i < E; ++i)
{
int tmp1, tmp2;
cin >> tmp1 >> tmp2;
vtovis.insert(tmp1);
vtovis.insert(tmp2);
edge[tmp1].insert(tmp2);
edge[tmp2].insert(tmp1);
}
for (auto& elem : vtovis)
{
if (vis[elem] == 0)
{
int cnt = 0;
dfs(elem, ++id, cnt);
if (cnt > 2)
add += (cnt - 1) / 2;
}
}
if (E == 0)
cout << 0 << endl;
else
cout << ((id - 1) + E + add) * T << endl;
}
}