【2066】一个人的旅行

2066
Dijkstra算法求最短路径

#include<bits/stdc++.h>
using namespace std;
const int MAX=0xfffffff;
int mep[1005][1005];
bool vis[1005];//是否访问
int dis[1005];//路程 
int st[1005],e[1005]; //相邻的城市和想去的地方 
int main(){

	int t,s,d;//有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个
	int a,b,time;//a,b城市之间的车程是time小时 ,a,b间可以有多条路

	while(cin>>t>>s>>d){
		//初始化 
		int mintime=MAX;
		memset(st,0,sizeof(st));
		memset(e,0,sizeof(e));
		for(int i=1;i<=1000;i++){
			for(int j=1;j<=1000;j++){
				if(i==j)mep[i][j]=0;
				else	mep[i][j]=MAX;
			}
		}
		while(t--){
			scanf("%d%d%d",&a,&b,&time);
//			cin>>a>>b>>time;
			if(mep[a][b]>time)mep[a][b]=mep[b][a]=time;
		}
		for(int i=1;i<=s;i++){
			scanf("%d",&st[i]);
		}
		for(int i=1;i<=d;i++){
			scanf("%d",&e[i]);
		}
		for(int i=1;i<=s;i++){
			memset(vis,false,sizeof(vis));
			vis[st[i]]=true;//相邻的城市不需要时间,默认为起始点 
			for(int j=1;j<=1000;j++){
				dis[j]=mep[st[i]][j]; 
			}
			dis[st[i]]=0;//相邻没有距离 
			int pos;
			for(int j=1;j<=1000;j++){
				int min=MAX;
				for(int k=1;k<=1000;k++){
					if(!vis[k]&&dis[k]<min){
						min=dis[k];
						pos=k;
					}
				}
				vis[pos]=true;//寻找最短路 
				for(int k=1;k<=1000;k++){
					if(!vis[k] && dis[k]>dis[pos]+mep[pos][k]){
						dis[k]=dis[pos]+mep[pos][k];
					}
				}
			}
			
			for(int j=1;j<=d;j++){
				if(dis[e[j]]<mintime){
					mintime=dis[e[j]];
				}
			}
		}
		cout<<mintime<<endl;
	}
	return 0;
}

遇到reference to ’ *** ’ is ambiguous 错误是因为全局变量名和引用的库里面的属性或者方法重名了,改掉就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值