vijos1909 noip2014 尋找道路

2021-07-06 02:30:17 字數 1875 閱讀 7113

在有向圖 g 中,每條邊的長度均為 1,現給定起點和終點,請你在圖中找一條從起點到 終點的路徑,該路徑滿足以下條件:

路徑上的所有點的出邊所指向的點都直接或間接與終點連通。

在滿足條件 1 的情況下使路徑最短。

注意:圖 g 中可能存在重邊和自環,題目保證終點沒有出邊。 請你輸出符合條件的路徑的長度。

第一行有兩個用乙個空格隔開的整數 n 和 m,表示圖有 n 個點和 m 條邊。

接下來的 m 行每行 2 個整數 x、y,之間用乙個空格隔開,表示有一條邊從點 x 指向點y。

最後一行有兩個用乙個空格隔開的整數 s、t,表示起點為 s,終點為 t。

輸出只有一行,包含乙個整數,表示滿足題目描述的最短路徑的長度。

如果這樣的路徑不存在,輸出-1。

3 2

1 22 1

1 3

-1

6 6

1 21 3

2 62 5

4 53 4

1 5

3
對於 30%的資料,0 < n ≤ 10,0 < m ≤ 20;

對於 60%的資料,0 < n ≤ 100,0 < m ≤ 2000;

對於 100%的資料,0 < n ≤ 10,000,0 < m ≤ 200,000,0 < x,y,s,t ≤ n,x ≠ t。 

【輸入輸出樣例1說明】

如上圖所示,箭頭表示有向道路,圓點表示城市。起點 1 與終點 3 不連通,所以滿足題目描述的路徑不存在,故輸出-1。

【輸入輸出樣例2說明】

如上圖所示,滿足條件的路徑為 1->3->4->5。注意點 2 不能在答案路徑中,因為點 2 連了一條邊到點 6,而點 6 不與終點 5 連通。

noip2014 提高組 day2

因為每條邊長度為1,所以可以兩次bfs求最短路徑。

第一次從終點bfs,判斷每個點是否與終點連通,並且判斷每個點是否為好點。第二次從起點bfs,求得最短路徑。

最初我寫的bfs一直在t...到現在也不知道為什麼

#include#include#include#include#include#include#define f(i,j,n) for(int i=j;i<=n;i++)

#define d(i,j,n) for(int i=j;i>=n;i--)

#define ll long long

#define maxm 400005

#define maxn 10005

#define inf 1000000000

using namespace std;

struct edge_type

e[maxm];

int n,m,x[maxm],y[maxm],s,t,head[maxn],dis[maxn],cnt=0;

bool f[maxn];

queueq;

int read()

return ret;

}void add_edge(int u,int v)

void bfs(int u,int flag)

} }}int main()

s=read(); t=read();

bfs(t,0);

f(i,1,m) if (dis[y[i]]==-1) f[x[i]]=true;

if (f[s])

bfs(s,1);

printf("%d\n",dis[t]);

return 0;

}

P1909 NOIP2016 普及組 買鉛筆

題目描述 p老師需要去商店買n支鉛筆作為小朋友們參加noip的禮物。她發現商店一共有 3種包裝的鉛筆,不同包裝內的鉛筆數量有可能不同,也有可能不同。為了公平起 見,p老師決定只買同一種包裝的鉛筆。商店不允許將鉛筆的包裝拆開,因此p老師可能需要購買超過nn支鉛筆才夠給小朋 友們發禮物。現在p老師想知道...

vijos1783 NOIP2012 疫情控制

h國有 n 個城市,這 n 個城市用 n 1 條雙向道路相互連通構成一棵樹,1 號城市是首都,也是樹中的根節點。h國的首都爆發了一種危害性極高的傳染病。當局為了控制疫情,不讓疫情擴散到邊境城市 葉子節點所表示的城市 決定動用軍隊在一些城市建立檢查點,使得從首都到邊境城市的每一條路徑上都至少有乙個檢查...

noip2010 飛彈攔截 vijos1810

經過11 年的韜光養晦,某國研發出了一種新的飛彈攔截系統,凡是與它的距離不超過其工作半徑的飛彈都能夠被它成功攔截。當工作半徑為0 時,則能夠攔截與它位置恰好相同的飛彈。但該飛彈攔截系統也存在這樣的缺陷 每套系統每天只能設定一次工作半徑。而當天的使用代價,就是所有系統工作半徑的平方和。某天,雷達捕捉到...