題解:UVA117 The Postal Worker Rings Once

cly312發表於2024-10-02

此題要求我們求尤拉回路的長度。

使用 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;
}

相關文章