tyvj ["扫地"杯III day1]破坏基地

P2040 - ["扫地"杯III day1]破坏基地

From liouzhou_101    Normal (OI) 总时限:10s    内存限制:128MB

背景 Background

“扫地”杯III NOIP2012模拟赛 day1 第三题

描述 Description

在Z国和W国之间一直战火不断。 好不容易,W国的间谍把完整的Z国的军事基地的地图到手了。 于是W国决定再次出击,一举击破Z国的防线。 W国认真研究了Z国的地形,发现Z国有N个军事基地,我们不妨编号成1..N,而且经过深刻研究,发现1号军事基地是资源补给基地,而N号军事基地是前线。 由于地形的缘故,只有M对军事基地两两可达,当然是有距离的。 此时W国的弹头紧缺,当下的弹头只能去毁灭一个军事基地。当然了,最重要的就是毁灭一个军事基地,使得资源补给基地与前线的最短距离发生变化。但是Z国也不是白痴,他们的资源补给基地与前线有着极高的防御力,所以W国只能去炸掉其余的N-2个基地,当然炸掉某个基地后,这个基地就不可达了。 于是问题就来了,炸掉哪些基地后会使得资源补给基地与前线的最短距离发生变化呢? 注:假若炸掉某个基地后,1号基地和N号基地不连通,那么我们也认为他们的最短距离发生了变化。

输入格式 InputFormat

输入数据第一行是两个正整数N,M,意义如题所述。 接下来M行,每行包括三个正整数x,y,d,表示有一条边连接x、y两个地点,其距离为d。 数据保证图是连通的。

输出格式 OutputFormat

输出数据的第一行包含一个整数K,表示有K个基地可毁灭,且毁灭其中任意一个后,资源补给基地与前线的最短距离发生变化。 接下来K行,每行输出一个军事基地的编号,要求编号递增。 在wyl8899神犇的率领下,W国必胜!!! 因此一定不会存在K=0的情况。

样例输入 SampleInput [复制数据]

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

样例输出 SampleOutput [复制数据]

1
2

数据范围和注释 Hint

对于30%的数据,N<=100,M<=1,000; 对于60%的数据,N<=2,000,M<=20,000; 对于100%的数据,N<=10,000,M<=100,000,1<=d<=10,000;

时间限制 TimeLimitation

1s

来源 Source

liouzhou_101
题解: 官方 http://hi.baidu.com/liouzhou_101/item/9b524ec8f11cb06388ad9e70
容我吐槽一下...尼玛这数据渣到爆 根本不用求割点 害得老子研究了一晚上 直接SPFA输出路径就能A 什么渣逼的数据啊.........
program tyvj2040; var q:array[1..100000] of integer; dist,d,r:array[1..10000] of longint; a:array[0..10000] of longint; b:array[0..3000000,1..3] of longint; mark:array[0..10000] of boolean; s,n,m,l,head,tail,now,k,i,j,x,y,z,dd:longint; procedure qsort(head,tail:integer); var i,j,x:integer; begin i:=head;j:=tail;x:=r[head]; while i<j do begin while (i<j)and(r[j]>=x) do dec(j); r[i]:=r[j]; while (i<j)and(r[i]<=x) do inc(i); r[j]:=r[i]; end; r[i]:=x; if head<i-1 then qsort(head,i-1); if tail>i+1 then qsort(i+1,tail); end; procedure push(k:longint); begin inc(head);q[head]:=k; mark[k]:=true; end; function pop:longint; begin pop:=q[tail]; inc(tail); end; begin fillchar(mark,sizeof(mark),false); readln(n,m);z:=0; for i:=1 to n do dist[i]:=maxlongint; for i:=1 to m do begin readln(x,y,dd); inc(z);b[z,1]:=y;b[z,2]:=dd;b[z,3]:=a[x];a[x]:=z; inc(z);b[z,1]:=x;b[z,2]:=dd;b[z,3]:=a[y];a[y]:=z; end; head:=0;tail:=1; push(1); dist[1]:=0; while head>=tail do begin k:=pop;s:=a[k]; while s<>0 do begin now:=b[s,1];dd:=b[s,2]; if dist[now]>dist[k]+dd then begin d[now]:=k; dist[now]:=dist[k]+dd; if not mark[now] then push(now); end; s:=b[s,3]; end; mark[k]:=false; end; k:=n;l:=0; while d[k]>1 do begin inc(l);r[l]:=d[k]; k:=d[k]; end; qsort(1,l); writeln(l); for i:=1 to l  do writeln(r[i]); end.

posted on 2012-10-31 11:15  馒头~blue  阅读(244)  评论(0编辑  收藏  举报

导航