程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 3256(SPFA)

POJ 3256(SPFA)

編輯:C++入門知識

這題只能對每一個點查一遍……
有向圖的話能用floyd,可是迫於時限用了SPFA。


[delphi] 
Program aa; 
const 
   maxk=10000; 
   maxn=10000; 
   maxm=10000; 
var 
   k,n,m,i,j,l:longint; 
   a:array[1..maxk] of longint; 
   q:array[1..maxn] of longint; 
   edge,next,head:array[1..maxm] of longint; 
   size:longint; 
   res,num,b:array[1..maxn] of boolean; 
 
procedure add(u,v:longint); 
begin 
   inc(size); 
   edge[size]:=v; 
   next[size]:=head[u]; 
   head[u]:=size; 
end; 
 
 
procedure spfa; 
var 
   i,j,p,now,v:longint; 
begin 
   i:=1;j:=1; 
   while (i<=j) do 
   begin 
      now:=q[i]; 
      p:=head[now]; 
      while p<>0 do 
      begin 
         v:=edge[p]; 
         if not(b[v]) then 
         begin 
            b[v]:=true; 
            inc(j); 
            q[j]:=v; 
         end; 
 
 
 
         p:=next[p]; 
      end; 
      inc(i); 
   end; 
   for i:=1 to n do 
      res[i]:=res[i] and b[i]; 
 
end; 
 
begin 
   size:=0; 
   fillchar(head,sizeof(head),0); 
   fillchar(edge,sizeof(edge),0); 
   fillchar(next,sizeof(next),0); 
   fillchar(b,sizeof(b),false); 
   fillchar(res,sizeof(res),true); 
   fillchar(num,sizeof(num),false); 
   read(k,n,m); 
   for i:=1 to k do read(a[i]); 
   for i:=1 to m do 
   begin 
      read(j,l); 
      add(j,l); 
   end; 
 
   for i:=1 to k do 
      if not(num[a[i]]) then 
      begin 
         num[a[i]]:=true; 
         q[1]:=a[i]; 
         fillchar(b,sizeof(b),false); 
         b[q[1]]:=true; 
         spfa; 
      end;  www.2cto.com
   l:=0; 
   for i:=1 to n do if res[i] then inc(l); 
   writeln(l); 
 
 
 
end. 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved