/* 1.无向连通图G是欧拉图,当且仅当G不含奇数度结点(G的所有结点度数为偶数); 2.无向连通图G含有欧拉通路,当且仅当G有零个或两个奇数度的结点; 3.有向连通图D是欧拉图,当且仅当D中每个结点的入度=出度 4.有向连通图D含有欧拉通路,当且仅当D中除两个结点外,其余每个结点的入度=出度, 且此两点满足deg-(u)-deg+(v)=±1。 flody算法 */ #include<stdio.h> #include<iostream> #include<vector> #include<string> using namespace std; int mat[27][27]; int degree[27]; void flody() { for(int k=0; k<26; k++) for(int i=0; i<26; i++) for(int j=0; j<26; j++) if(mat[i][k] + mat[k][j] < mat[i][j]) mat[i][j] = mat[i][k] + mat[k][j]; } int main() { // freopen("in.txt","r",stdin); string s; int i, x, y, k, sum, j; vector<int> v; while(cin>>s) { sum = 0; memset(degree,0,sizeof(degree)); v.clear(); for(i=0; i<26; i++) for(j=0; j<26; j++) { if(i!=j) mat[i][j] = 1<<20; else mat[i][j] = 0; } x = s[0] - 'a'; y = s[s.size()-1] - 'a'; k = s.size(); degree[x]++; degree[y]++; mat[y][x] = mat[x][y] = k; sum += k; while(cin>>s && s != "deadend") { x = s[0] - 'a'; y = s[s.size()-1] - 'a'; k = s.size(); sum += k; mat[x][y] = mat[y][x] = k; degree[x]++; degree[y]++; } bool flag = false; for(i=0; i<26; i++) { if(degree[i] % 2 == 1) { v.push_back(i); flag = true; } } flody(); if(flag) { sum += mat[v[0]][v[1]]; printf("%d/n",sum); } else { printf("%d/n",sum); } } return 0; } http://poj.org/problem?id=1237