4-50 2.2.1

//调用Dijkstra算法,并在判断距离时加上等待时间的判断 
#include <iostream>
using namespace std;
#define MAX 100

typedef struct AMGraph{
	
	int vexs[MAX];
	int arcs[MAX][MAX];
	
	int vexnum,arcnum;
}AMGraph;

void initG(AMGraph &G,int v,int a){
	
	for(int i=1;i<=v;i++){ //初始边表 
		for(int j=1;j<=v;j++){
			G.arcs[i][j] = MAX;
		}
	}
	
	int i,j,w;
	for(int k=0;k<a;k++){//无向图边赋值 
		cin>>i>>j>>w;
		G.arcs[i][j] = w;
		G.arcs[j][i] = w;
	}
	
	G.arcnum = a;
	G.vexnum = v;
	
	return;
}

void Dijkstra(AMGraph G,int M,int T,int A){
	//该算法初始的三个数组
	int l=G.vexnum+1;
	int S[l],D[l],Path[l]; //不使用0坐标 
	int Mw = (M%2)==1?1:2;
	for(int i=1;i<l;i++){
		S[i] = 0;
		D[i] = G.arcs[M][i]+Mw;
		Path[i] = G.arcs[M][i] < MAX+Mw?M:-1;
	}
	
	S[M] =1;
	D[M] =0;
	
	for(int i=1;i<G.vexnum;i++){ //n-1轮 
		
		int min=MAX+2;
		int op=-1;

		for(int j=1;j<=G.vexnum;j++){
			//int wait = (j%2)==1?1:2;//奇1偶2    是在你身处的点判断奇偶 
			if(S[j]==0&&D[j] < min){
				min = D[j];
				op = j;

			}
		}

		S[op] = 1;
		
		for(int j=1;j<=G.vexnum;j++){
			int wait = (op%2)==1?1:2;
			if(S[j]==0&&D[op]+G.arcs[op][j]+wait < D[j]){
				D[j]  =D[op]+G.arcs[op][j]+wait;
				Path[j] = op;
			}
		}
		
	} 
	
	if(D[T] <= A)cout<<"YES "<<D[T]<<endl;
	else cout<<"KENG"<<D[T]<<endl; 
	
	return;
}

int main(){
	int N,S,M,T,A;
	while(cin>>N>>S>>M>>T>>A){
		AMGraph G;
		initG(G,N,S);
		
		Dijkstra(G,M,T,A);//plus版本,最后判断是否符合A 
		
	}
	
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值