首页 > 其他分享 >L3-007 天梯地图

L3-007 天梯地图

时间:2024-04-03 17:58:34浏览次数:14  
标签:tmp pre dist cout int 007 L3 天梯 510

拿起题就开始写,最后提交测试点2和测试点3就是过不去。
感觉一点问题都没有,好郁闷,找了半天,发现地点的编号是0开始的,而我一直在从1遍历....
思路就是两个dijkstra,这两次思路是完全一样的,只是一个是最短距离最少节点,一个是最短时间最短距离,所以分别需要增加一个累计经过节点数量和累计节点距离(cnt和distances)。
结果我都是用dist来存的,第一个dist表示的是最短路径,第二个表示的是最短时间。

#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
int dist[510],visited[510];
int edges[510][510],hao[510][510]; 
int pre[510];//前一个节点 
int cnt[510];//累计节点数量 
int distances[510];//累计节点距离 
int minTime,minPath;
void dijkstra(int dist[],int visited[],int n,int s){//最短节点最少 
     dist[s]=0;
	 for(int i=0;i<n;i++){
	 	int minv=inf,minx;
	 	for(int j=1;j<=n;j++){
	 		if(!visited[j]&&dist[j]<minv){
	 			minv=dist[j];
	 			minx=j;
			 }
		}
		visited[minx]=1;
		for(int j=0;j<n;j++){//更新 
			if(minv+edges[minx][j]<dist[j]){//更短 
				dist[j]=minv+edges[minx][j];
				pre[j]=minx;
				cnt[j]=cnt[minx]+1;
			}else if(minv+edges[minx][j]==dist[j]){//是否更新 
				if(cnt[minx]+1<cnt[j]){
					pre[j]=minx;
					cnt[j]=cnt[minx]+1;
				}
			}
		}
	 }	
}
void dijkstra2(int dist[],int visited[],int n,int s){//最快路径最短 
     dist[s]=0;
	 for(int i=0;i<n;i++){
	 	int minv=inf,minx;
	 	for(int j=1;j<=n;j++){
	 		if(!visited[j]&&dist[j]<minv){
	 			minv=dist[j];
	 			minx=j;
			 }
		}
		visited[minx]=1;//已经来过 
		for(int j=0;j<n;j++){//更新 
			if(minv+hao[minx][j]<dist[j]){//更快 
				dist[j]=minv+hao[minx][j];
				pre[j]=minx;
				distances[j]=distances[minx]+edges[minx][j];
			}else if(minv+hao[minx][j]==dist[j]){//是否更新 
				if(distances[minx]+edges[minx][j]<distances[j]){
					pre[j]=minx;
					distances[j]=distances[minx]+edges[minx][j];
				}
			}
		}
	 }	
}
int main(){
	memset(dist,0x3f,sizeof(dist));
	memset(edges,0x3f,sizeof(edges));
	memset(visited,0,sizeof(visited));
	memset(pre,-1,sizeof(pre));
	memset(hao,0x3f,sizeof(hao));
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int a,b,way,dist,shi;
		cin>>a>>b>>way>>dist>>shi;
		if(way){
			edges[a][b]=dist;
			hao[a][b]=shi;
		}else{
			edges[a][b]=edges[b][a]=dist;
			hao[a][b]=hao[b][a]=shi;
		}
	}
	int start,ed;
	cin>>start>>ed;
	dijkstra(dist,visited,n,start);
    minPath=dist[ed];//最短距离 
	vector<int> vec,vec2;
	set<vector<int>> st;
	int tmp = ed;
	vec.push_back(tmp);
	while(pre[tmp]!=-1){
		vec.push_back(pre[tmp]);
		tmp=pre[tmp];
	}
    st.insert(vec);
	memset(visited,0,sizeof(visited));
    memset(pre,-1,sizeof(pre));
    memset(dist,0x3f,sizeof(dist));
    dijkstra2(dist,visited,n,start);
    minTime=dist[ed];//最快 
    tmp=ed;
    vec2.push_back(tmp);
	while(pre[tmp]!=-1){
		vec2.push_back(pre[tmp]);
		tmp=pre[tmp];
	}
    st.insert(vec2);
    if(st.size()==1){
    	cout<<"Time = "<<minTime<<"; Distance = "<<minPath<<": ";
	    int flag = 0;
		for(int i=vec.size()-1;i>=0;i--){
			if(flag) cout << " => ";
			cout << vec[i];
			flag++;
		}
	}else{
		cout<<"Time = "<<minTime<<": ";
		int flag = 0;
		for(int i=vec2.size()-1;i>=0;i--){
			if(flag) cout << " => ";
			cout << vec2[i];
			flag++;
		}
		cout<<"\nDistance = "<<minPath<<": ";
		flag = 0;
		for(int i=vec.size()-1;i>=0;i--){
			if(flag) cout << " => ";
			cout << vec[i];
			flag++;
		}
	}
	return 0;
}

标签:tmp,pre,dist,cout,int,007,L3,天梯,510
From: https://www.cnblogs.com/chengyiyuki/p/18113226

相关文章

  • L3-005 垃圾箱分布
    dijkstra。#include<bits/stdc++.h>usingnamespacestd;constintinf=0x3f3f3f3f;intdistances[1010][1010];intdis[1020],visited[1020];intedges[1020][1020];voiddijkstra(intdis[],intvisited[],intn,ints){//s起点 dis[s]=0; for(inti=1;i&l......
  • P3622 [APIO2007] 动物园 -题解
    好写爱写没事干所以有了这篇题解洛谷P3622[APIO2007]动物园题解$Link$hzoi题库洛谷题目说的挺繁琐,其实就传达了一个很简单的信息:\(n\)个动物,\(c\)个小孩,每个小孩能看到\(5\)个动物(所在的位置)\(E\)到\(E+4\),有\(F\)个害怕的动物,\(L\)个喜欢的动物。如果视野中有至......
  • L3-003 社交集群
    并查集的应用,我感觉这题不是很容易想出来。然后....代码看注释吧。写法一,#include<bits/stdc++.h>usingnamespacestd;inta[1010][1010],fa[1010];intgetf(intx){ while(fa[x]!=-1){ x=fa[x]; } returnx;}voidmerge(intx,inty){ intf1=getf(x); intf2=......
  • L3-002 特殊堆栈
    维护两个栈。一个正常放数据,另一个是排序好的数据。#include<bits/stdc++.h>usingnamespacestd;intmain(){ vector<int>data; vector<int>mdata; vector<int>::iteratorit; intn; cin>>n; while(n--){strings; cin>>s; if(s==......
  • L3-001 凑零钱
    一道很简单的DFS。#include<bits/stdc++.h>usingnamespacestd;intn,m,a[10010];vector<int>res;voiddfs(intstart,intown){ for(inti=start;i<n;i++){ if(own+a[i]>m)return; elseif(own+a[i]==m){ res.push_back(a[i]); intflag=0;......
  • 手把手教你做阅读理解题-初中中考阅读理解解题技巧007-Mapping out the future
    手把手教你做阅读理解题-初中中考阅读理解解题技巧007-MappingoutthefuturePDF格式公众号回复关键字:ZKYD007阅读理解技巧,在帮助读者有效获取和理解文本信息方面发挥着重要作用,熟练掌握如下6个技巧,可快速突破阅读理解1预览文章结构在开始深入阅读之前,快速浏览文章的标......
  • SMU 2024 spring 天梯赛自主训练3
    SMU2024spring天梯赛自主训练37-12018我们要赢-SMU2024spring天梯赛自主训练3(pintia.cn)2018wo3men2yao4ying2!7-2打折-SMU2024spring天梯赛自主训练3(pintia.cn)#include<bits/stdc++.h>#definedebug(a)cout<<#a<<"="<<a<<......
  • SMU 2024 spring 天梯赛2
    SMU2024spring天梯赛27-1计算指数-SMU2024spring天梯赛2(pintia.cn)#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intn,ans=1;cin>>n;......
  • SMU 2024 spring 天梯赛3
    SMU2024spring天梯赛37-1重要的话说三遍-SMU2024spring天梯赛3(pintia.cn)I'mgonnaWIN!I'mgonnaWIN!I'mgonnaWIN!7-2两小时学完C语言-SMU2024spring天梯赛3(pintia.cn)#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;......
  • Pintia 天梯地图 dijkstra进阶
    7-14天梯地图-SMU2024spring天梯赛3(补题)(pintia.cn)dijkstra进阶做法,包含路径记录,以及按权重统计路径条件等;不过最开始我一直将优先队列开的最大堆,但是一直过不了自己的例子,后来改成最小堆并且路径值改成负数存进去就对了,再后来我发现改成最大堆也可以,不过要把......