题目来源:ZZULIOJ
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 2e6+10;
typedef pair<long,long> pll;
vector<pll> G[N];
int dis1[N],dis2[N];
void dijkstra(int s,int dis[])
{
bool vis[N];
priority_queue<pll> heap;
memset(vis,0,sizeof vis);
dis[s]=0;
heap.push(make_pair(0,s));
while(heap.size()){
auto t=heap.top();
heap.pop();
int u=t.second;
int sum=t.first;
if(vis[u]) continue;
vis[u]=true;
for(int i=0;i<G[u].size();i++){
int v=G[u][i].first;
if(dis[v]>dis[u]+G[u][i].second){
dis[v]=dis[u]+G[u][i].second;
heap.push(make_pair(-dis[v],v));
}
}
}
}
void solve(){
int n,m;
cin>>n>>m;
int p=n+m,cnt=0;
memset(dis1,0x3f3f3f3f,sizeof dis1);
memset(dis2,0x3f3f3f3f,sizeof dis2);
for(int i=1;i<=1e6+10;i++){
G[i].clear();
}
dis1[1]=0;
dis2[n]=0;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
for(int j=1;j<=y;j++){
int u;
cin>>u;
G[u].push_back({p+cnt,0});
G[p+cnt].push_back({u,x});
}
cnt+=1;
}
dijkstra(1,dis1);
dijkstra(n,dis2);
int anss=1e18;
for(int i=1;i<=n;i++){
if(dis1[i]>=1e18 || dis2[i]>=1e18) continue;
int x=max(dis1[i],dis2[i]);
anss=min(anss,x);
}
cout<<anss<<endl;
for(int i=1;i<=n;i++){
if(dis1[i]>=1e18 ||dis2[i]>=1e18) continue;
int x=max(dis1[i],dis2[i]);
if(x==anss){
cout<<i<<' ';
}
}
cout<<endl;
}
int main(){
int kk=1;
while(kk--){
solve();
}
return 0;
}