此題要求我們求尤拉回路的長度。
使用 Floyd 演算法計算圖中任意兩點之間的最短路徑,對於度數為奇數的路口(最多有兩個),找到它們之間的最短路徑並將其加入總路徑長度中。
程式碼:
#include<bits/stdc++.h>
#define INF 1e8
using namespace std;
int degree[26];
int path[26][26];
int allPathLen=0;
bool iod=false;
int startV;
int endV;
inline int indexOf(char c){
return (int)c-'a';
}
void init(){
for(int i=0;i<26;++i){
degree[i]=0;
for(int j=0;j<26;++j){
path[i][j]=INF;
}
}
allPathLen=0;
iod=false;
startV=-1;
endV=-1;
}
int shortestPath(int start,int end){
for(int k=0;k<26;++k){
for(int i=0;i<26;++i){
for(int j=0;j<26;++j){
if(path[i][j]>path[i][k]+path[k][j])
path[i][j]=path[i][k]+path[k][j];
}
}
}
return path[start][end];
}
int main(){
init();
string input_str;
while(cin>>input_str){
if(input_str=="deadend"){
for(int i=0;i<26;++i)
if(degree[i]%2){
if(!iod){
startV=i;
iod=true;
}else{
endV=i;
break;
}
}
if(iod)
allPathLen+=shortestPath(startV,endV);
cout<<allPathLen<<endl;
init();
continue;
}
int len=input_str.length();
int v1=indexOf(input_str[0]);
int v2=indexOf(input_str[len-1]);
degree[v1]++;
degree[v2]++;
if(len<path[v1][v2]){
path[v1][v2]=len;
path[v2][v1]=len;
}
allPathLen+=len;
}
return 0;
}