1807. [NOIP2014]尋找道路P2296 尋找道路

来源:http://www.cnblogs.com/zwfymqz/archive/2017/05/24/6899931.html
-Advertisement-
Play Games

題目描述 在有向圖G 中,每條邊的長度均為1 ,現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件: 1 .路徑上的所有點的出邊所指向的點都直接或間接與終點連通。 2 .在滿足條件1 的情況下使路徑最短。 註意:圖G 中可能存在重邊和自環,題目保證終點沒有出邊。 請你輸出符合條 ...


題目描述

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

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

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

註意:圖G 中可能存在重邊和自環,題目保證終點沒有出邊。

請你輸出符合條件的路徑的長度。

輸入輸出格式

輸入格式:

輸入文件名為road .in。

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

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

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

輸出格式:

輸出文件名為road .out 。

輸出只有一行,包含一個整數,表示滿足題目᧿述的最短路徑的長度。如果這樣的路徑不存在,輸出- 1 。

輸入輸出樣例

輸入樣例#1:
3 2  
1 2  
2 1  
1 3  
輸出樣例#1:
-1
輸入樣例#2:
6 6  
1 2  
1 3  
2 6  
2 5  
4 5  
3 4  
1 5  
輸出樣例#2:
3

說明

解釋1:

如上圖所示,箭頭表示有向道路,圓點表示城市。起點1 與終點3 不連通,所以滿足題

目᧿述的路徑不存在,故輸出- 1 。

解釋2:

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

對於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。

 

這道題我們可以用逆向思維來想

如果一個點能到達終點,那麼終點也一定能到達這個點

這樣就簡單了

從終點跑一遍BFS,算出每一個點的訪問次數

然後把不能走的點刪去

最後spfa帶走

一個很有意思的能夠找出訪問次數而且不會死迴圈的方法

1 int to=edge[i].v;

2 if(cs[to]++)continue; 3 q.push(to);    完整代碼
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<queue>
  6 #define INF 0x7ffffff
  7 using namespace std;
  8 int read(int & n)
  9 {
 10     int flag=0,x=0;char c='/';
 11     while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;}
 12     while(c>='0'&&c<='9')x=x*10+(c-48),c=getchar();
 13     if(flag)n=-x;else n=x;
 14 }
 15 const int MAXN=200001;
 16 int n,m,bgx,bgy;
 17 int rudu[MAXN];
 18 struct node
 19 {
 20     int u,v,w,nxt;
 21 }edge[MAXN];
 22 int num=1;
 23 int head[MAXN];
 24 int flag[MAXN];// 記錄每個值是否能夠到達終點 
 25 int cs[MAXN];
 26 int dis[MAXN];
 27 int vis[MAXN];
 28 void add_edge(int ll,int rr,int ww)
 29 {
 30     edge[num].u=ll;
 31     edge[num].v=rr;
 32     edge[num].w=ww;
 33     edge[num].nxt=head[ll];
 34     head[ll]=num++;
 35 }
 36 void bfs()
 37 {
 38     queue<int>q;
 39     int tot=0;
 40     q.push(bgx),tot++;
 41     while(q.size()!=0)
 42     {
 43         int p=q.front();
 44         q.pop();
 45         for(int i=head[p];i!=-1;i=edge[i].nxt)
 46         {
 47             int to=edge[i].v;
 48             if(cs[to]++)continue;
 49             q.push(to);
 50         }
 51     }
 52     //rudu[bgy]=0;
 53     for(int i=1;i<=n;i++)
 54         if(rudu[i]!=cs[i]&&i!=bgy)
 55             flag[i]=1;
 56 }
 57 void dele()
 58 {
 59     for(int i=1;i<=num;i++)
 60     {
 61         if(flag[edge[i].u]!=0)
 62         {
 63             edge[i].u=-1;
 64             edge[i].v=-1;
 65             edge[i].w=-1;
 66             edge[i].nxt=-1;
 67         }
 68     }
 69 }
 70 void spfa()
 71 {
 72     queue<int>q;
 73     q.push(bgx);
 74     dis[bgx]=0;
 75     while(q.size()!=0)
 76     {
 77         int p=q.front();
 78         q.pop();
 79         vis[p]=0;
 80         for(int i=head[p];i!=-1;i=edge[i].nxt)
 81         {
 82             if(edge[i].u==-1)continue;
 83             int to=edge[i].v;
 84             if(dis[to]>dis[p]+edge[i].w)
 85             {
 86                 dis[to]=dis[p]+edge[i].w;
 87                 if(vis[to]==0)
 88                 {
 89                     vis[to]=1;
 90                     q.push(to);
 91                 }
 92             }
 93         }
 94     }
 95     if(dis[bgy]==INF)
 96     printf("-1");
 97     else
 98     printf("%d",dis[bgy]);
 99 }
100 int main()
101 {
102     freopen("roadb.in","r",stdin);
103     freopen("roadb.out","w",stdout);
104     read(n);read(m);
105     for(int i=1;i<=n;i++)head[i]=-1,dis[i]=INF;
106     for(int i=1;i<=m;i++)
107     {
108         int x,y;
109         read(x);read(y);
110         add_edge(y,x,1);
111         rudu[x]++;
112     }
113     read(bgy);read(bgx);
114     bfs();
115     dele();
116     spfa();
117     return 0;
118 }

 

 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 眾多高級語言都從C/C++有所借鑒,所以說C/C++的語言基礎對從事軟體開發的人員來說非常重要。 《C和C++程式員面試秘笈》是一本解析C/C++面試題的書,可以幫助求職者更好地準備面試。《C和C++程式員面試秘笈》共包含12章,囊括了目前企業中常見的面試題類型和考點,包括C/C++程式基礎,預處理 ...
  • 作業 2, 模擬計算器開發:實現加減乘除及拓號優先順序解析用戶輸入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等類似公式後,必須自己解析裡面的(),+,-,*,/符 ...
  • 一.遇見的問題: 當單元格設置為日期類型時,cell.getCellStyle().getDataFormat()返回的值都為176。 poi jar包3.14以上不支持用cell.getCellType()判斷類型的方法。 使用poi解析技術需要導入poi以及poi-ooxml兩個jar包。 二. ...
  • 題目描述 某一村莊在一條路線上安裝了n盞路燈,每盞燈的功率有大有小(即同一段時間內消耗的電量有多有少)。老張就住在這條路中間某一路燈旁,他有一項工作就是每天早上天亮時一盞一盞地關掉這些路燈。 為了給村裡節省電費,老張記錄下了每盞路燈的位置和功率,他每次關燈時也都是儘快地去關,但是老張不知道怎樣去關燈 ...
  • 在Java編程中78條極具實用價值的經驗規則,這些經驗規則涵蓋了大多數開發人員每天所面臨的問題的解決方案。通過對Java平臺設計專家所使用的技術的全面描述,揭示了應該做什麼,不應該做什麼才能產生清晰、健壯和高效的代碼。第2版反映了Java 5中重要的變化,並刪去了過時的內容。 《Effective ...
  • spring 事務註解 預設遇到throw new RuntimeException("...");會回滾需要捕獲的throw new Exception("...");不會回滾// 指定回滾@Transactional(rollbackFor=Exception.class) public voi ...
  • 類載入機制 JVM把class文件載入的記憶體,並對數據進行校驗、轉換解析和初始化,最終形成JVM可以直接使用的Java類型的過程就是載入機制。 類從被載入到虛擬機記憶體中開始,到卸載出記憶體為止,它的生命周期包括了:載入(Loading)、驗證(Verification)、準備(Preparation) ...
  • 本文是一篇關於《Effective Python》書中一節的學習筆記,記錄了示例代碼和思路。 如果函數要產生一系列結果,那麼最簡單的做法就是把這些結果都放在一個列表裡返回。 比如我們要查出字元串中每個詞的首字母在整串字元串中的位置: 該函數的使用: 這個函數思路很明瞭,但存在的問題在於代碼擁擠、冗餘 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...