NC26257 小雨坐地铁

比较裸的拆点最短路吧

  • 注意特判起点终点相等的情况,起点终点相等不需要换乘任何线路,答案为0
const int N=1010,M=510;
struct Node
{
    int u,line,dis;
    bool operator>(const Node &W) const
    {
        return dis>W.dis;
    }
};
vector<PII> g[N][M];
int dist[N][M];
bool vis[N][M];
int cost[M],cash[M];

int n,m,st,ed;

void dijkstra()
{
    memset(dist,0x3f,sizeof dist);
    dist[st][0]=0;
    priority_queue<Node,vector<Node>,greater<Node> > heap;
    heap.push({st,0,0});

    while(heap.size())
    {
        int t=heap.top().u,line=heap.top().line;
        heap.pop();

        if(vis[t][line]) continue;
        vis[t][line]=true;

        for(int i=1;i<=m;i++)//换乘
            if(dist[t][i]>dist[t][line]+cost[i])
            {
                dist[t][i]=dist[t][line]+cost[i];
                heap.push({t,i,dist[t][i]});
            }

        for(int i=0;i<g[t][line].size();i++)//下一站
        {
            int j=g[t][line][i].fi,w=g[t][line][i].se;
            if(dist[j][line]>dist[t][line]+w)
            {
                dist[j][line]=dist[t][line]+w;
                heap.push({j,line,dist[j][line]});
            }
        }
    }
}

int main()
{
    cin>>n>>m>>st>>ed;

    for(int i=1;i<=m;i++)
    {
        int t;
        cin>>cost[i]>>cash[i]>>t;
        int last=-1;
        for(int j=0;j<t;j++)
        {
            int x;
            cin>>x;
            if(~last)
            {
                g[last][i].pb({x,cash[i]});
                g[x][i].pb({last,cash[i]});
            }
            last=x;
        }
    }

    dijkstra();

    int res=INF;
    if(st == ed) res=0;
    
    for(int i=1;i<=m;i++)
        res=min(res,dist[ed][i]);
    if(res == INF) res=-1;
    cout<<res<<endl;

    //system("pause");
}
posted @ 2020-10-23 10:32  Dazzling!  阅读(116)  评论(0编辑  收藏  举报