Pat甲级1111,Online Map

pat甲级1111

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<vector>
using namespace std;
const int INF=99999999;
int main(){
	int n,m;
	cin>>n>>m;
	int dis[n][n],tim[n][n],r1,r2,nu,d,t;//dis存放边长,tim存放时间 
	fill(dis[0],dis[0]+n*n,INF);
	fill(tim[0],tim[0]+n*n,INF);
	for(int i=0;i<m;i++){
		cin>>r1>>r2>>nu>>d>>t;
		dis[r1][r2]=d;
		tim[r1][r2]=t;
		if(nu==0){//如果单连通 
			dis[r2][r1]=d;
			tim[r2][r1]=t;
		}
	}
	cin>>r1>>r2;
	vector<int> ve[n];//记录由r1到达每个点的路径 
	ve[r1].push_back(r1);
	int distance[n],all_time[n];//记录由r1到达每个点的距离,时间 
	fill(distance,distance+n,INF);
	fill(all_time,all_time+n,INF);
	distance[r1]=0;
	all_time[r1]=0;
	bool vis[n]={false};//是否已经确定路径 
	for(int i=0;i<n;i++){//dijkstra算法 
		int minnum=INF,ans;
		for(int j=0;j<n;j++){ //确定最短路径 
			if(!vis[j]&&distance[j]<minnum){
				minnum=distance[j];
				ans=j;
			}
		}
		vis[ans]=true;
		for(int j=0;j<n;j++){//路径刷新 
			vector<int> vee=ve[ans];
			if(!vis[j]&&distance[ans]+dis[ans][j]<distance[j]){
				distance[j]=distance[ans]+dis[ans][j];
				all_time[j]=all_time[ans]+tim[ans][j];
				vee.push_back(j);
				ve[j]=vee;
				vee.clear();
			}
			else if(!vis[j]&&distance[ans]+dis[ans][j]==distance[j]&&all_time[ans]+tim[ans][j]<all_time[j]){
				distance[j]=distance[ans]+dis[ans][j];
				all_time[j]=all_time[ans]+tim[ans][j];
				vee.push_back(j);
				ve[j]=vee;
				vee.clear();
			}
		}
	}
	vector<int> ve2[n];//与上面原理相同,找出时间最短路径,如果时间相同通过节点数最少 
	ve2[r1].push_back(r1);
	int total_time[n],section[n];
	fill(total_time,total_time+n,INF);
	fill(section,section,0);
	total_time[r1]=0;
	bool vis2[n]={false};
	for(int i=0;i<n;i++){
		int mintime=INF,ans;
		for(int j=0;j<n;j++){
			if(!vis2[j]&&total_time[j]<mintime){
				mintime=total_time[j];
				ans=j;
			}
		}
		vis2[ans]=true;
		for(int j=0;j<n;j++){
			vector<int> vee2=ve2[ans];
			int sectionnum=section[ans];
			sectionnum++;
			if(!vis2[j]&&total_time[ans]+tim[ans][j]<total_time[j]){
				total_time[j]=total_time[ans]+tim[ans][j];
				section[j]=sectionnum;
				vee2.push_back(j);
				ve2[j]=vee2;
				vee2.clear();
			}
			else if(!vis2[j]&&total_time[ans]+tim[ans][j]==total_time[j]&&sectionnum<section[j]){
				total_time[j]=total_time[ans]+tim[ans][j];
				section[j]=sectionnum;
				vee2.push_back(j);
				ve2[j]=vee2;
				vee2.clear();
			}
		}
	}
	bool equal=true;//判断路径是否相同 
	if(ve[r2].size()!=ve2[r2].size())
		equal=false;
	else{
		for(int i=0;i<ve[r2].size();i++){
			if(ve[r2][i]!=ve2[r2][i]){
				equal=false;
				break;
			}
		}
	}
	if(!equal){
		cout<<"Distance = "<<distance[r2]<<": ";
		for(int i=0;i<ve[r2].size();i++){
			cout<<ve[r2][i];
			if(i!=ve[r2].size()-1)
				cout<<" -> ";
		}
		cout<<endl;
		cout<<"Time = "<<total_time[r2]<<": ";
		for(int i=0;i<ve2[r2].size();i++){
			cout<<ve2[r2][i];
			if(i!=ve2[r2].size()-1)
				cout<<" -> ";
		}
		cout<<endl;
	}
	else{
		cout<<"Distance = "<<distance[r2]<<"; ";
		cout<<"Time = "<<total_time[r2]<<": ";
		for(int i=0;i<ve2[r2].size();i++){
			cout<<ve2[r2][i];
			if(i!=ve2[r2].size()-1)
				cout<<" -> ";
		}
		cout<<endl;
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值