愤怒的小朋友+热浪

来源:互联网 发布:压缩文件的编程原理 编辑:程序博客网 时间:2024/04/27 19:01

热浪

题目描述

德克萨斯纯朴的人们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品。Farmer John此时以先天下之忧而忧,后天下之乐而乐的精神,身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛奶的重任,以减轻德克萨斯人忍受酷暑的痛苦。

FJ已经研究过可以把牛奶从威斯康星运送到德克萨斯州的路线。这些路线包括起始点和终点先一共经过T (1 <= T <= 2,500)个城镇,方便地标号為1到T。除了起点和终点外地每个城镇由两条双向道路连向至少两个其它地城镇。每条道路有一个通过费用(包括油费,过路费等等)。

给定一个地图,包含C (1 <= C <= 6,200)条直接连接2个城镇的道路。每条道路由道路的起点Rs,终点Re (1 <= Rs <= T; 1 <= Re <= T),和花费(1 <= Ci <= 1,000)组成。求从起始的城镇Ts (1 <= Ts <= T)到终点的城镇Te(1 <= Te <= T)最小的总费用。

输入

第一行: 4个由空格隔开的整数: T, C, Ts, Te
第2到第C+1行: 第i+1行描述第i条道路。有3个由空格隔开的整数: Rs, Re和Ci

输出

一个单独的整数表示从Ts到Te的最小总费用。数据保证至少存在一条道路。

样例输入

7 11 5 4
2 4 2
1 4 3
7 2 2
3 4 3
5 7 5
7 3 3
6 1 1
6 3 4
2 4 3
5 6 3
7 2 1

样例输出

7

var w:array[0..15000,1..3]of longint; s,dist:array[0..2500]of longint; t:array[0..24800]of longint; i,j,k:longint; m,n,len,a,b,c,head,tail,start,finish,tt:longint;procedure init(a,b,c:longint);begin w[len,1]:=b; w[len,2]:=c; if w[a,3]=0 then w[a,3]:=len else w[w[a,1],3]:=len; w[a,1]:=len; inc(len);end;begin readln(n,m,start,finish); len:=n+1; for i:=1 to m do  begin   readln(a,b,c);   init(a,b,c); init(b,a,c);  end; for i:=1 to n do  dist[i]:=maxlongint; head:=1; tail:=2; t[head]:=start; s[start]:=1; dist[start]:=0; while head<tail do  begin   for i:=head to tail-1 do    begin     tt:=w[t[i],3];     while tt<>0 do      begin       if w[tt,2]+dist[t[i]]<dist[w[tt,1]]       then begin        dist[w[tt,1]]:=w[tt,2]+dist[t[i]];        if s[w[tt,1]]=0        then begin s[w[tt,1]]:=1; t[tail]:=w[tt,1]; inc(tail); end;       end;       tt:=w[tt,3];      end;     s[t[i]]:=0; inc(head);    end;  end; writeln(dist[finish]);end.

愤怒的小朋友

题目描述

最后,清醒过来的小朋友们发现自己手里一点糖果的没有,这种失望渐渐演变成了愤怒。于是,古有百万雄师下长江,今有十万小朋友追Steven。现在Steven已经到了生死关头,急需你的帮助!
城市里一共有N个路口。Steven位于路口1,而他的家位于路口N。城市中一共有M条双向道路,每条道路连接两个路口,通过这条路需要一定的时间。保证没有任意一条道路两端是同一个路口,也保证一定存在一条让Steven逃回家的道路。Steven想问问你他最快的逃回家需要多长时间?

输入

第一行两个整数N,M。
接下来的M行每行三个整数,ai, bi, ti.表示一条连通路口ai和bi的道路,通过这条道路用时为ti

输出

一行一个整数。为最少需要的时间。
样例输入
4 5
1 2 3
1 3 4
2 3 5
4 3 5
1 4 1

样例输出

1

提示

对于70%的数据N<=100,M<=200;
对于100%的数据 N<=50000,M<=200000,1<=ai, bi<=N,1<=ti<=104

var w:array[0..460000,1..3]of longint; s,dist:array[0..50000]of longint; t:array[0..800000]of longint; i,j,k:longint; m,n,len,a,b,c,head,tail,start,finish,tt:longint;procedure init(a,b,c:longint);begin w[len,1]:=b; w[len,2]:=c; if w[a,3]=0 then w[a,3]:=len else w[w[a,1],3]:=len; w[a,1]:=len; inc(len);end;begin readln(n,m); len:=n+1; for i:=1 to m do  begin   readln(a,b,c);   init(a,b,c); init(b,a,c);  end; start:=1; finish:=n; for i:=1 to n do  dist[i]:=maxlongint; head:=1; tail:=2; t[head]:=start; s[start]:=1; dist[start]:=0; while head<tail do  begin   for i:=head to tail-1 do    begin     tt:=w[t[i],3];     while tt<>0 do      begin       if w[tt,2]+dist[t[i]]<dist[w[tt,1]]       then begin        dist[w[tt,1]]:=w[tt,2]+dist[t[i]];        if s[w[tt,1]]=0        then begin s[w[tt,1]]:=1; t[tail]:=w[tt,1]; inc(tail); end;       end;       tt:=w[tt,3];      end;     s[t[i]]:=0; inc(head);    end;  end; writeln(dist[finish]);end.
0 0