NYOJ-1238-最少换乘

来源:互联网 发布:sql查看创建表语句 编辑:程序博客网 时间:2024/05/07 21:26

ACM模版

描述

描述

题解

和今年天梯赛 L3-2 题面很像,但是更加简单一些。这个题只是一个单纯的最短路,不过我们需要先对路线进行一个比较特殊的建图处理,比如说,4 7 3 6,我们应该在 4 74 34 67 37 63 6 之间都连一条线,权值为 1 的线,然后求最短路即可。

代码

#include <iostream>#include <cstdio>#include <vector>#include <queue>#include <cstring>using namespace std;const int MAXN = 505;const int INF = 0x3f3f3f3f;vector<int> vi[MAXN];int d[MAXN], vis[MAXN], a[MAXN];char s[100 * MAXN];void spfa(int s){    queue<int> q;    q.push(s);    vis[s] = 1;    d[s] = -1;    while (!q.empty())    {        int u = q.front();        vis[u] = 0;        q.pop();        for (int i = 0; i < vi[u].size(); i++)        {            int v = vi[u][i];            if (d[v] > d[u] + 1)            {                d[v] = d[u] + 1;                if (!vis[v])                {                    vis[v] = 1;                    q.push(v);                }            }        }    }}int main(){    int T;    cin >> T;    int n, m;    while (T--)    {        memset(vis, 0, sizeof(vis));        cin >> m >> n;        getchar();        for (int i = 1; i <= n; i++)        {            d[i] = INF;            vi[i].clear();        }        for (int i = 0; i < m; i++)        {            fgets(s, 100 * MAXN, stdin);            int len = (int)strlen(s);            len--;            int cnt = 0;            for (int i = 0; i < len; i++)            {                while (s[i] == ' ')                {                    i++;                }                int num = 0;                while (s[i] >= '0' && s[i] <= '9')                {                    num *= 10;                    num += s[i] - '0';                    i++;                }                a[cnt++] = num;            }            for (int j = 0; j < cnt; j++)            {                for (int k = j + 1; k < cnt; k++)                {                    vi[a[j]].push_back(a[k]);                }            }        }        spfa(1);        if (d[n] == INF)        {            cout << "NO" << endl;        }        else        {            cout << d[n] << endl;        }    }    return 0;}
0 0
原创粉丝点击