返回题解分享
讨论 / 题解分享/ 帖子详情

路径(结果填空) - 题解

###### 模板暴力解法,用时70s

#include <bits/stdc++.h>
#include <windows.h>
using namespace std;
#define int long long
#define endl '\n'

vector<vector<int>>graph;
const int inf = 1e18;
void creategraph(int n){
	graph = vector<vector<int>>(n+1,vector<int>(n+1));
	for(int i=1;i<n+1;i++){
		for(int j=1;j<n+1;j++){
			if(i==j){
				graph[i][j] = 0;
			} 
			else{
				graph[i][j] = inf;
			}
		}
	}
}

void addedge(int start,int end,int count){
	graph[start][end] = min(graph[start][end],count);
	graph[end][start] = min(graph[end][start],count);
}

int getmax(int a,int b){
	while(b){
		int temp = b;
		b = a%b;
		a = temp;
	}
	return a;
}

int getnum(int a,int b){
	int num = abs(a-b);
	if(num>21){
		return inf;
		
	}
	return a/getmax(a,b)*b;
}

signed main(){
	
	creategraph(2021);
	for(int i=1;i<=2021;i++){
		for(int j=i;j<=2021;j++){
			int num = getnum(i,j);
//			cout<<i<<" "<<j<<" ";
//			cout<<num<<endl;
//			Sleep(1000);
			addedge(i,j,num);
		}
	}
	for(int k=1;k<=2021;k++){
		for(int i=1;i<=2021;i++){
			for(int j=1;j<=2021;j++){
				graph[i][j] = min(graph[i][j],graph[i][k]+graph[k][j]);
//				cout<<graph[i][j]<<endl;
			}
		}
	}
	cout<<graph[1][2021];
	
	return 0;
}
0 回复 0 转发 0 喜欢 0 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!