poj1847Tram的dijkstra解法

来源:互联网 发布:苹果手机网络加速软件 编辑:程序博客网 时间:2024/05/22 00:26

题意:
首先输入n,a,b
然后输入n行,第i(1 =< i <= n)行的第一个数字表示从这站出发的列车数目Ki,然后接下来的Ki个数表示目的车站,其中第一个数表示默认目的地,如果需要到其他站需要改变switch,求从a到b需要改变switch的最小次数

分析:设默认目的地cost为0,其他为1,那么就变成求最短路径的问题,直接代入公式.

/** Filename:    code.cpp* Created:     2017-08-11* Author:        wyl6 *[mail:17744454343@163.com]* Desciption:  Desciption*/#include <cstdio>#include <cstdlib>#include <iostream>#include <stack>#include <queue>#include <algorithm>#include <cstring>#include <string>#include <cmath>#include <vector>#include <bitset>#include <list>#include <sstream>#include <set>#include <functional>using namespace std;#define INF 1 << 30#define MAX 100typedef pair<int,int> P;int n,a,b;int m,k;int d[101];struct edge{    int cost,to;    edge() {}    edge(int cost,int to):cost(cost),to(to){};};vector <edge> G[101];void dijkstra(int s){    priority_queue<P,vector<P>,greater<P> > que;    fill(d+1,d+n+1,INF);    d[s] = 0;    que.push(P(0,s));    while (!que.empty()){        P p = que.top();        que.pop();        int v = p.second;        for (int i = 0; i < G[v].size(); i += 1){            edge e = G[v][i];            if (d[e.to] > d[v] + e.cost){                d[e.to] = d[v] + e.cost;                que.push(P(d[e.to],e.to));            }        }    } }int main(int argc, char const* argv[]){    cin >> n >> a >> b;    for (int i = 1; i <= n; i += 1){        cin >> m;        for (int j = 0; j < m; j += 1){            cin >> k;            if (j == 0 ) G[i].push_back(edge(0,k));            else G[i].push_back(edge(1,k));        }    }        dijkstra(a);    if(d[b] < INF) printf("%d\n",d[b]);    else printf("-1\n");    return 0;}
原创粉丝点击