交通查詢系統

2021-06-04 18:48:26 字數 3580 閱讀 2491

description

眾所周知,交通情況是大家在日常生活中比較關心的問題。一條道路所允許的最大同時平行車輛數稱為這條道路的最大吞吐量,我們假定這裡都是雙向道路。而我們經常要想知道兩個站之間的最大總吞吐量。

由於你的才華橫溢,過於出眾,於是你就被交通部任命設計這個交通部的查詢軟體,允許市民查詢目前城市的任意兩個站之間的最大總吞吐量。

input

輸輸入的第一行包括兩個整數n和m,分別表示該城市的站點個數和道路的個數。

接下去有m行,每行有三個整數u、v、c(1<=u、v<=n,1<=c<=10^4),表示u和v站點之間有一條道路,且吞吐量為c。

然後一行有乙個整數q。代表市民的查詢次數。

接下去有q行,每行有兩個整數s、t(1<=s、t<=n),表示市民的乙個查詢。

50%的資料保證n<=50,q<=10000

100%的資料保證n<=300 和q<=100000

output

對於每組查詢(s、t),輸出s到t的最大總吞吐量。

input

2 1
1 2 2

2

1 2

2 1

output

2

2

在讀入圖的時候,先把任意兩個點之間的最大流求出來,用dist[i,j]儲存,然後在查詢的時候,只需要直接輸出就行了。。。
乙個最小割,要注意fillchar的使用,賦最大值的時候用fillchar(f,sizeof(f),127)或fillchar(f,sizeof(f),$7f),就是賦成maxlongint;賦成-1是fillchar(f,sizeof(f),255);(正確性有待考證),不過最好再加個 div 2,免得256.。。。。 

另外,這道題還有乙個坑爹的地方是,兩個點之間不只一條邊。。。其實noi的題大多都有這樣的陷阱,所以,除非題目特別說明,還是當做不只一條邊來做。。。。。

var n,m,ans,q,flow,s,t,maxn:longint;

f,dist,g:array[0..500,0..500]of longint;

dis,now,fa,fan,pre,sum:array[0..500]of longint;

v:array[0..500]of boolean;

procedure init;

var i,j,x,y,c:longint;

begin

fillchar(g,sizeof(g),0);

readln(n,m);

for i:=1 to m do

begin

readln(x,y,c);

if c>f[x,y] then

begin

g[x,y]:=g[x,y]+c;

g[y,x]:=g[y,x]+c;

end;

end;

maxn:=maxlongint div 4;

end;

procedure sap;

var i,j,k,flow,minn:longint;vis:boolean;

begin

ans:=0;

fillchar(sum,sizeof(sum),0);

fillchar(dis,sizeof(dis),0);

for i:=1 to n do now[i]:=1;

sum[0]:=n;

i:=s;flow:=maxn;

while dis[s]0)and(dis[i]=dis[j]+1) then

begin

now[i]:=j;

vis:=true;

if f[i,j]s do

begin

k:=pre[i];

f[k,i]:=f[k,i]-flow;

f[i,k]:=f[i,k]+flow;

i:=k;

end;

flow:=maxn

end;

break;

end;

if vis then continue;

minn:=maxn;

for j:=1 to n do

if (f[i,j]>0)and(dis[j]s then

begin

i:=pre[i];flow:=fan[i];

end;

end;

end;

function min(a,b:longint):longint;

begin

if a>b then exit(b) else exit(a);

end;

procedure dfs(i:longint);

var j:longint;

begin

v[i]:=true;

for j:=1 to n do

if (f[i,j]>0)and(not v[j]) then dfs(j);

end;

procedure ask;

var i,x,y:longint;

begin

readln(q);

for i:=1 to q do

begin

readln(x,y);

if x=y then writeln(0)

else

writeln(dist[x,y]);

end;

end;

procedure main;

var i,j:longint;

begin

fillchar(dist,sizeof(dist),127 div 2);

for i:=1 to n do fa[i]:=1;

for i:=2 to n do

begin

f:=g;

s:=fa[i];t:=i;

sap;

fillchar(v,sizeof(v),0);

dfs(s);

for j:=i+1 to n do

if not v[j] then fa[j]:=i;

for j:=1 to i-1 do

begin

dist[j,i]:=min(dist[j,fa[i]],ans);

dist[i,j]:=dist[j,i];

end;

end;

ask;

end;

begin

assign(input,'traffic.in');reset(input);

assign(output,'traffic.out');rewrite(output);

init;

main;

close(input);close(output);

end.

交通控制系統

設計要求 用vhdl語言設計乙個由一條主幹道和一條支幹道的匯合點形成的十字交叉路口的交通燈控制器,要求如下 1 主 支幹道各設乙個紅 綠 黃指示燈,led顯示 2 主幹道處於常允許通行狀態,支幹道有車來的時候才允許通行 主幹道允許通行時亮綠燈,支幹道紅燈。支幹道允許通行時亮綠燈,主幹道亮紅燈 3 主...

交通罰單管理系統

大一時的c語言程式設計的課設,當時上課沒怎麼聽,在網路和同學的幫助下完成的,現在看來 不足很多,貼在這留個紀念吧。主要實現功能就是對交通罰單 乙個txt檔案 的增刪查改,交通罰單的txt檔案需要自己準備放在工程目錄下。define num 100 define test 28 include inc...

交通燈管理系統

銀行業務排程系統模擬銀行排程系統邏輯。需求 銀行內有6個業務視窗,1 4為普通視窗,5為快速視窗,6為vip視窗。有三種型別客戶 vip客戶,快速客戶 交水電費類業務 普通客戶。一部隨機生成各種型別的客戶,概率比例為 vip客戶 快速客戶 普通客戶 1 3 6。客戶辦理用時設定最少時間。各型別客戶在...