此题要求我们求欧拉回路的长度。
使用 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;
}
标签:26,int,题解,Worker,Rings,str,input,path
From: https://www.cnblogs.com/cly312/p/18444919