双关键字最短路,最近好颓废呀!!!
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#define inf 10000000000000000
#define maxn 1010
using namespace std;
int b[maxn][maxn],d[maxn],q[maxn],c[maxn];
long long dis[maxn],a[maxn][maxn];
bool vis[maxn];
int n,m,num,s,t,mx;
void spfa()
{
for (int i=1;i<=mx;i++) dis[i]=inf;
dis[s]=0;d[s]=0;
int l=0,r=1;
q[1]=s;vis[s]=1;
while (l!=r)
{
l++;if (l==maxn) l=0;
int x=q[l];
for (int i=1;i<=mx;i++)
if (dis[x]+a[x][i]<dis[i] || (dis[x]+a[x][i]==dis[i] && d[x]+b[x][i]<d[i]))
{
dis[i]=dis[x]+a[x][i];
d[i]=d[x]+b[x][i];
if (!vis[i])
{
r++;if (r==maxn) r=0;
q[r]=i;vis[i]=1;
}
}
vis[x]=0;
}
}
int main()
{
for (int i=1;i<=1000;i++)
for (int j=1;j<=1000;j++)
a[i][j]=inf;
scanf("%d%d%d",&s,&t,&n);
for (int i=1;i<=n;i++)
{
int len,cnt;
scanf("%d%d",&len,&cnt);
for (int j=1;j<=cnt;j++) {scanf("%d",&c[j]);mx=max(mx,c[j]);}
for (int j=1;j<=cnt;j++)
for (int k=j+1;k<=cnt;k++)
if (len<a[c[j]][c[k]] || (len==a[c[j]][c[k]] && k-j<b[c[j]][c[k]]))
{
a[c[j]][c[k]]=len;b[c[j]][c[k]]=k-j;
}
}
spfa();
if (dis[t]!=inf) printf("%lld %d\n",dis[t],d[t]);
else printf("-1 -1\n");
return 0;
}