2021 RoboCom CAIP本科组决赛-7-4 猛犸不上 Ban

1.题目

题目链接:7-4 猛犸不上 Ban - 2021 RoboCom 世界机器人开发者大赛-本科组(决赛) (pintia.cn)

2.题解

cpp 复制代码
//题意:s->s和s->t最短 
//1.s->t直接使用模板dijkstra
//2.s->s最短:分解成s->i+i->s
//求第一段s->i就是模板dijkstra
//因为不能重复,求i->s之前需要将s->i经过的路线全部标记一下,表示不可达
//然后再使用模板dijkstra即可
#include<bits/stdc++.h>
using namespace std;
const int N=510;
const int inf=0x3f3f3f3f;  //规定无穷大 
int n,m,s,t; 
int g[N][N];  //存储图
bool ok[N][N],vis[N]; //是否路线被标记不可达,dijkstra的vis访问数组 
int dis[N],pre[N];  //距离数组、前驱数组 
void dijkstra(int st){
	memset(dis,inf,sizeof(dis));
	memset(pre,-1,sizeof(pre));
	memset(vis,0,sizeof(vis));
	dis[st]=0;
	for(int k=1;k<=n;k++){
		//1.选择dis距离最小的坐标
		int tmp=-1;
		for(int i=1;i<=n;i++){
			if(!vis[i]&&(tmp==-1||dis[tmp]>dis[i]))
				tmp=i;
		}
		if(tmp==-1) break;
		vis[tmp]=true;
		//2.更新数组
		for(int i=1;i<=n;i++){
			if(ok[tmp][i]) continue; //ok标记之后,相当于tmp与i不可达 
			if(dis[i]>dis[tmp]+g[tmp][i]){
				dis[i]=dis[tmp]+g[tmp][i];
				pre[i]=tmp; 
			}
		} 
	} 
}
//求st->ed的路径(可达)+结合dijktra(st)才能正确使用 
//是为了在求s->中的i->s路径之前需要将s->i的路线全部标记 
vector<int> p;  //存储路线 
void getPath(int st,int ed){
	p.clear();
	int x=ed;
	while(x!=st){
		p.push_back(x);
		x=pre[x];
	}
	p.push_back(st);
	reverse(p.begin(),p.end()); 
} 
int main(void){
	cin>>n>>m>>s>>t;
	memset(g,inf,sizeof(g)); 
	for(int i=1;i<=m;i++){
		int a,b,c;
		cin>>a>>b>>c;
		g[a][b]=g[b][a]=c;
	}
	//1. 求s->t
	dijkstra(s);
	int res2=dis[t];
	if(res2==inf) res2=-1;
	//2. 求s->s
	int res1=inf;
	for(int i=1;i<=n;i++){    //i为中转点,但是不能是s 
		//1-1. s->i 
		if(i==s) continue;
		memset(ok,0,sizeof(ok));
		dijkstra(s);
		if(dis[i]==inf) continue;  //第一段不可达,不可能是中转点 
		int d1=dis[i];  //记录第一段的值
		//将s->i经过路径标记为不可达 
		getPath(s,i);
		for(int j=0;j<p.size()-1;j++){
			ok[p[j]][p[j+1]]=ok[p[j+1]][p[j]]=1;
		}
		//1-2. 求i->s
		dijkstra(i);
		if(dis[s]==inf) continue;  //第二段不可达
		res1=min(res1,d1+dis[s]); 
	}
	if(res1==inf) res1=-1;
	cout<<res1<<" "<<res2<<endl; 
	if(res1==-1) cout<<"Lose!";
	else if(res2==-1) cout<<"Win!";
	else if(res1<res2) cout<<"Win!"; 
	else cout<<"Lose!";
	return 0;
} 
相关推荐
kyle~29 分钟前
机器视觉---熔池相机(穿透强光的视觉感知)
c++·数码相机·计算机视觉·机器人·焊接机器人
宏笋33 分钟前
C++ Coroutines(协程) 详解
c++
王老师青少年编程1 小时前
csp信奥赛C++高频考点专项训练之前缀和&差分 --【一维前缀和】:求区间和
c++·前缀和·csp·高频考点·信奥赛·求和区间和
黎阳之光1 小时前
黎阳之光:以视频孪生重构智能监盘,为燃机打造新一代智慧电厂大脑
大数据·人工智能·算法·安全·数字孪生
绝知此事1 小时前
【算法突围 02】树形结构与数据库索引:树形结构与数据库索引:从 BST 到 B+ 树的演化与 MySQL 优化
数据库·mysql·算法·面试·b+树
kyle~2 小时前
机器人时间链路---工程流程示例
c++·3d·机器人·ros2
清木!2 小时前
排序算法比较
数据结构·算法·排序算法
吴可可1232 小时前
用Teigha修改并保存CAD文件
数据库·算法·c#
汉克老师3 小时前
GESP6级C++考试语法知识(十七、数据结构(三、认识队列 Queue))
数据结构·c++·队列·gesp6级·gesp六级·数组模拟队列
灰灰勇闯IT3 小时前
ops-reduce:ReduceMax 与 ReduceMean 的并行优化
算法