• 【ZJOI2017 Round1练习&UVA1057】D6T1 Routing(DP,SPFA)


    题意:给你一个有向图, 并指定起点和终点

    问要从起点走向终点, 再从终点走向起点, 最少需要走过多少不同的节点。 

    对于 100%的数据, 有 N<=100M<=min(1000,N*N)。 图中可能有重边或者自环

    思路:

      1 const oo=700000000;
      2 var head1,head2,vet1,vet2,next1,next2:array[1..10000]of longint;
      3     q:array[0..100000]of record
      4                           x,y:longint;
      5                          end;
      6     dis,f:array[1..100,1..100]of longint;
      7     inq:array[1..100,1..100]of boolean;
      8     n,m,i,j,k,cas,tot1,tot2,x,y,z:longint;
      9 
     10 function min(x,y:longint):longint;
     11 begin
     12  if x<y then exit(x);
     13  exit(y);
     14 end;
     15 
     16 procedure spfa;
     17 var i,j,u1,u2,e1,e2,v1,v2,t,w,t1,w1,tmp:longint;
     18 begin
     19  for i:=1 to n do
     20   for j:=1 to n do
     21   begin
     22    inq[i,j]:=false;
     23    dis[i,j]:=oo;
     24   end;
     25  t:=0; w:=1; t1:=0; w1:=1;
     26  q[1].x:=1; q[1].y:=1; inq[1,1]:=true; dis[1,1]:=1;
     27  while t<w do
     28  begin
     29   inc(t); inc(t1);
     30   if t1=(n*n)<<1 then t1:=0;
     31   u1:=q[t1].x; u2:=q[t1].y; inq[u1,u2]:=false;
     32 
     33   e1:=head1[u1];
     34   while e1<>0 do
     35   begin
     36    v1:=vet1[e1];
     37    tmp:=dis[u1,u2];
     38    if v1<>u2 then inc(tmp);
     39    if tmp<dis[v1,u2] then
     40    begin
     41     dis[v1,u2]:=tmp;
     42     if not inq[v1,u2] then
     43     begin
     44      inc(w); inc(w1);
     45      if w1=(n*n)<<1 then w1:=0;
     46      q[w1].x:=v1; q[w1].y:=u2; inq[v1,u2]:=true;
     47     end;
     48    end;
     49    e1:=next1[e1];
     50   end;
     51 
     52   e2:=head2[u2];
     53   while e2<>0 do
     54   begin
     55    v2:=vet2[e2];
     56    tmp:=dis[u1,u2];
     57    if v2<>u1 then inc(tmp);
     58    if tmp<dis[u1,v2] then
     59    begin
     60     dis[u1,v2]:=tmp;
     61     if not inq[u1,v2] then
     62     begin
     63      inc(w); inc(w1);
     64      if w1=(n*n)<<1 then w1:=0;
     65      q[w1].x:=u1; q[w1].y:=v2; inq[u1,v2]:=true;
     66     end;
     67    end;
     68    e2:=next2[e2];
     69   end;
     70 
     71 
     72   if (u1<>u2)and(dis[u1,u2]+f[u1,u2]-1<dis[u2,u1]) then
     73   begin
     74    dis[u2,u1]:=dis[u1,u2]+f[u1,u2]-1;
     75    if not inq[u2,u1] then
     76    begin
     77     inc(w); inc(w1);
     78     if w1=(n*n)<<1 then w1:=0;
     79     q[w1].x:=u2; q[w1].y:=u1; inq[u2,u1]:=true;
     80    end;
     81   end;
     82  end;
     83 end;
     84 
     85 procedure add1(a,b:longint);
     86 begin
     87  inc(tot1);
     88  next1[tot1]:=head1[a];
     89  vet1[tot1]:=b;
     90  head1[a]:=tot1;
     91 end;
     92 
     93 procedure add2(a,b:longint);
     94 begin
     95  inc(tot2);
     96  next2[tot2]:=head2[a];
     97  vet2[tot2]:=b;
     98  head2[a]:=tot2;
     99 end;
    100 
    101 begin
    102  assign(input,'uva1057.in'); reset(input);
    103  assign(output,'uva1057.out'); rewrite(output);
    104  while not eof do
    105  begin
    106   read(n,m);
    107   if n=0 then break;
    108   for i:=1 to n do
    109   begin
    110    head1[i]:=0;
    111    head2[i]:=0;
    112   end;
    113   tot1:=0; tot2:=0;
    114   inc(cas);
    115   writeln('Network ',cas);
    116   for i:=1 to n do
    117    for j:=1 to n do
    118     if i<>j then f[i,j]:=oo;
    119   for i:=1 to m do
    120   begin
    121    read(x,y);
    122    f[x,y]:=1;
    123    add1(x,y);
    124    add2(y,x);
    125   end;
    126   for i:=1 to n do
    127    for j:=1 to n do
    128     for k:=1 to n do f[j,k]:=min(f[j,k],f[j,i]+f[i,k]);
    129   if (f[1,2]=oo)or(f[2,1]=oo) then
    130   begin
    131    writeln('Impossible');
    132    writeln;
    133    continue;
    134   end;
    135   spfa;
    136   writeln('Minimum number of nodes = ',dis[2,2]);
    137   writeln;
    138  end;
    139  close(input);
    140  close(output);
    141 end.
  • 相关阅读:
    AJAX局部刷新
    jquery 调用数据
    java 节点流(字符流,字节流)和包装流(缓冲流,转换流)
    java File类的使用以及一些函数
    java 自定义泛型
    java 注解
    jdbc baseDAO 以及 每个类的继承
    jdbc 事物 commit 和rollback方法
    jdbc 可处理数据库事物的通用增删查改函数
    jdbc 数据库批处理insert操作
  • 原文地址:https://www.cnblogs.com/myx12345/p/6524792.html
Copyright © 2020-2023  润新知