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");
}