csu1256

1256: 天朝的單行道

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 169  Solved: 50
[Submit][Status][Web Board]

Description

    在另一個平行宇宙中,有一個神奇的國度名叫天朝。天朝一共有N個城市(標號分別爲1, 2, …, N),M條道路,爲了方便交通管制,天朝的M條道路都是單行道。
    不久前天朝大選,小Q當選了天朝的總統。小Q家住在城市1,但天朝的辦公地點在城市N,於是爲了便於工作,小Q決定舉家從城市1搬遷到城市N去居住。然而小Q驚奇的發現,現在並不存在從城市1出發到城市N路線。
    但這點難題是無法阻擋天朝總統的,小Q決定行使總統的權利下令更改一些道路的通行方向,使得至少存在一條從城市1出發到城市N的路線,但爲了節省時間和資源,他希望更改通行方向的道路儘可能少,你能幫幫小Q嗎?

Input

    輸入包含多組測試數據。
    對於每組測試數據,第一行包含兩個正整數N (2<=N<=5000)、M (1<=M<=10000),表示天朝一共有N個城市、M條道路。接下來M行每行有兩個正整數u、v (1<=u, v<=N),表示城市u和城市v之間有一條通行方向爲u->v的單行道。兩個城市之間可能有多條道路。

Output

    對於每組測試數據,用一行輸出一個整數表示最少需要更改多少條單行道的通行方向,才能使得至少存在一條路線能夠讓小Q從城市1出發到城市N。
    如果沒辦法使得至少存在一條路線讓小Q從城市1出發到城市N,則輸出“-1”(不包括引號)。

Sample Input

2 1
1 2

2 1
2 1

2 0

Sample Output

0
1
-1

最短路的應用。對u->v的邊 add_edge(u,v,0);增加一條u->v反向邊 add_edge(v,u,1),求一遍1->n的最短路。

#include <iostream>
#include <queue>
#include <vector>
#include <memory.h>
using namespace std;

int N,M;
int d[5002],inq[5002];
vector<int> g[5002];
vector<int> rg[5002];

void init()
{
    for(int i = 1;i <= N;i ++)
    {
        g[i].clear();
        rg[i].clear();
    }
}

void insert(int a,int b)
{
    g[a].push_back(b);
    rg[b].push_back(a);
}

void spfa()
{
    queue<int> q;
    memset(inq,0,sizeof(inq));
    memset(d,0x3f,sizeof(d));
    d[1] = 0;inq[1] = 1;q.push(1);
    while(!q.empty())
    {
        int a = q.front();q.pop();inq[a] = 0;
        for(int i = 0;i < g[a].size();i ++)
        {
            int b = g[a][i];
            if(d[b] > d[a])
            {
                d[b] = d[a];
                if(!inq[b]) inq[b] = 1,q.push(b);
            }
        }
        for(int i = 0;i < rg[a].size();i ++)
        {
            int b = rg[a][i];
            if(d[b] > d[a] + 1)
            {
                d[b] = d[a] + 1;
                if(!inq[b]) inq[b] = 1,q.push(b);
            }
        }

    }
    if(d[N] < 5000)  cout << d[N] << endl;
    else cout << -1 << endl;
}

int main()
{
    int a,b;
    while(cin >> N >> M)
    {
        init();
        for(int i = 0;i < M;i ++)
        {
            cin >> a >> b;
            insert(a,b);
        }
        spfa();
    }
    return 0;
}




發佈了69 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章