证明:
一个联通图 度数为奇数的点的个数只可能是小于2 ,也就是说不可能出现度数是奇数的点的个数为奇数
将一个联通图构成欧拉道路,需 添(k-2)/2条边,k 为度数为奇数的点的个数
统计出有x个联通块,需加 x - 1 条边
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int flag[maxn];
int vis[maxn];
int vv,e,k;
int res;
vector<int>g[maxn];
void read()
{
int x,y ;
for(int i = 1; i<= e; i++)
{
scanf("%d%d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
flag[x] = 1;
flag[y] = 1;
}
}
void dfs(int u)
{
vis[u] = 1;
if(g[u].size()%2)
{
res++;
}
for(int i= 0 ; i<g[u].size(); i++)
{
if(!vis[g[u][i]])
{
dfs(g[u][i]);
}
}
}
void init()
{
for(int i = 0 ; i<=vv; i++)
{
g[i].clear();
}
memset(vis,0,sizeof(vis));
memset(flag,0,sizeof(flag));
}
int main()
{
int Case = 1;
while(scanf("%d%d%d",&vv,&e,&k)!=EOF)
{
if(vv==0&&e==0&&k==0)
break;
init();
read();
int ans = 0 ;
int gg = 0;
for(int i =1 ; i<=vv; i++)
{
if(flag[i]&&!vis[i])
{
gg++;//统计有几个联通块
res = 0;
flag[i]= 1;
dfs( i );
if(res>=2)
{
res-=2 ;
}
ans+=(res)/2;//使得每一个联通块都为欧拉道路或者欧拉图
}
}
printf("Case %d: ",Case++);
printf("%d\n",max(0,ans+gg-1+e)*k);
}
return 0 ;
}