POJ 1847 N

题目链接: kuangbin带你飞 专题四 最短路练习 N - Tram

题意

电动巴士在每个十字路口有一个默认方向,走向别的方向需要改动扳手。
第一行给定十字路口的数量和起点终点
剩余n行给定与第i个十字路口相通的方向,第一个为默认方向

思路

典型模版题。直接dijkstra
ps:读题好费时间,英语是硬伤

代码

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;

const int N = 109;
const int MAX = 0x3f3f3f3f;
int dis[N];
bool vis[N];
vector<vector<pair<int, bool> > > map(N);

int dijkstra(int n, int s, int e)
{
    memset(vis, 0, sizeof(vis));
    memset(dis, 0x3f3f3f3f, sizeof(dis));

    dis[s] = 0;
    for(int i=1; i<=n; i++)
    {
        int x = -1;
        int max = MAX;
        for(int j=1; j<=n; j++)
        {
            if(!vis[j] && dis[j] < max)
                max = dis[x = j];
        }
        if(x == -1)
            break;

        vis[x] = 1;
        vector<pair<int, bool> >::iterator begin = map[x].begin();
        while(begin != map[x].end())
        {
            int y = (*begin).first;
            int val = (*begin).second + max;
            if(!vis[y] && dis[y] > val)
                dis[y] = val;
            ++begin;
        }
    }
    if(dis[e] == MAX)
        return -1;
    return dis[e];
}

int main()
{
    int n,s,e;
    scanf("%d%d%d", &n, &s, &e);
    for(int i=1; i<=n; i++)
    {
        int num, t;
        scanf("%d", &num);
        scanf("%d", &t);
        pair<int, bool> p(t, 0);
        map[i].push_back(p);
        for(int j=1; j<num; j++)
        {
            scanf("%d", &t);
            pair<int, bool> p(t, 1);
            map[i].push_back(p);
        }
    }
    printf("%d\n", dijkstra(n, s, e));
    return 0;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!