题解:UVA117 The Postal Worker Rings Once

此题要求我们求欧拉回路的长度。

使用 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;
}
posted @ 2024-10-02 17:44  cly312  阅读(20)  评论(0)    收藏  举报