Hole


var
n,m:integer;
g:array[1..150,1..150] of integer;
v,mv:integer;
best:array [1..150,0..1] of double;

{dijkstra}
i,j,p1,p2:integer;
nmin:real;
min:array [1..150,0..1] of double;
vis:array [1..150,0..1] of boolean;

procedure debugmin;
var i,j:integer;
begin
	for i:=0 to 1 do
	begin
		for j:=1 to 4 do
		begin
			write(min[j,i]:5:0);
			write('':5);
		end;
		writeln;
	end;
	writeln;
end;

procedure outp;
begin
	assign(output,'output.txt');
	rewrite(output);
	writeln(best[n,1]:0:2);
	close(output);
end;

procedure dijkstra;

begin
	fillchar(vis,sizeof(vis),false);
	vis[1,0]:=true;
	vis[1,1]:=true;
	
	for i:=2 to n do
	begin
		if g[1,i]<>0 then
		begin
			min[i,0]:=g[1,i]/v;
			min[i,1]:=g[1,i]/mv;
		end
		else
		begin
			min[i,0]:=1e10;
			min[i,1]:=1e10;
		end;
	end;
	
	debugmin;
	
	while vis[n,1]=false do
	begin
		nmin:=1e10;
		
		for i:=0 to 1 do
		begin
			for j:=1 to n do
			begin
				if not vis[j,i] and (min[j,i]<nmin) then
				begin
					nmin:=min[j,i];
					p1:=i;
					p2:=j;
				end;{end of if}
			end;{end of for}
			{选出最短的路径,并记录p1,p2}
		end;
		
		vis[p2,p1]:=true;
		best[p2,p1]:=nmin;
		
		writeln('choose:  ',p2,p1);
		
		if p1=0 then
		begin
			for i:=1 to n do
			begin
				if not vis[i,0] and (min[i,0]>min[p2,0]+g[p2,i]/v)
				and (g[p2,i]<>0) then
				begin
					
					min[i,0]:=min[p2,0]+g[p2,i]/v;
					
					debugmin;
				end;{end of if}
				
			end;
				
			for i:=1 to n do
			begin
				if not vis[i,1] and (min[i,1]>min[p2,0]+g[p2,i]/mv)
				and (g[p2,i]<>0) then
				begin
					min[i,1]:=min[p2,0]+g[p2,i]/mv;
					
					debugmin;
				end;{end of if}
			end;
			
		end{end of if}
		{更新未加速的路径}
		else
		begin
			for i:=1 to n do
			begin
				if not vis[i,1] and (min[i,1]>min[p2,1]+g[p2,i]/v)
				and (g[p2,i]<>0) then
				begin
					
					min[i,1]:=min[p2,1]+g[p2,i]/v;
					
					debugmin;
				end;
			end;{end of for}
		end;{end of else}
	end;{end of while}
end;

procedure init;
var i:integer;
t1,t2,t3:integer;
begin
	assign(input,'hole.txt');
	reset(input);
	fillchar(g,sizeof(g),0);
	read(n,m);
	for i:=1 to m do
	begin
		read(t1,t2,t3);
		if(g[t1,t2]=0) or (g[t1,t2]>t3) then
		begin
			g[t1,t2]:=t3;
			g[t2,t1]:=t3;
		end;
	end;
	read(v,mv);
end;

{main}
begin
init;
dijkstra;
outp;
end.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值