ACM学习历程—CodeForces 601A The Two Routes(最短路)

题目链接:http://codeforces.com/problemset/problem/601/A

题目大意是有铁路和陆路两种路,而且两种方式走的交通工具不能在中途相遇。

此外,有铁路的地方肯定没有陆路。

这种情况下就会有一个结论,就是至少有一种交通可以直接1n

这样只需要对另一种跑一个最短路就OK了。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <string>
#define LL long long

using namespace std;

const int maxN = 405;
int n, m;
bool dis[maxN][maxN];
int p[maxN];
bool flag;
struct node
{
    int val;
    int id;
    bool operator<(node x) const
    {
        return val > x.val;
    }
};

void input()
{
    memset(dis, false, sizeof(dis));
    int u, v;
    for (int i = 0; i < m; ++i)
    {
        scanf("%d%d", &u, &v);
        dis[u][v] = dis[v][u] = true;
    }
    if (dis[1][n]) flag = false;
    else flag = true;
}

void work()
{
    memset(p, -1, sizeof(p));
    int ans = 1, u;
    node k, v;
    priority_queue<node> q;
    p[1] = 0;
    k.val = 0;
    k.id = 1;
    q.push(k);
    while (!q.empty())
    {
        k = q.top();
        q.pop();
        u = k.id;
        for (int i = 1; i <= n; ++i)
        {
            if (i == u) continue;
            if (dis[i][u] != flag) continue;
            if (p[i] == -1 || p[i] > p[u]+1)
            {
                p[i] = p[u]+1;
                k.id = i;
                k.val = p[i];
                q.push(k);
            }
        }
    }
    if (p[n] == -1) ans = -1;
    else ans = p[n];
    printf("%d\n", ans);
}

int main()
{
    //freopen("test.in", "r", stdin);
    while (scanf("%d%d", &n, &m) != EOF)
    {
        input();
        work();
    }
    return 0;
}
View Code

 

posted on 2015-12-07 19:10  AndyQsmart  阅读(477)  评论(0编辑  收藏  举报

导航