Til the Cows Come Home poj-2387
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
#include<vector>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-10
#define PI acos(-1.0)
#define _e exp(1.0)
#define ll long long
const int maxn=1e3+5;
int cost[maxn][maxn];
int d[maxn];
bool used[maxn];
int n;
void dijkstra(int s)
{
fill(d,d+n,INF);
fill(used,used+n,false);
d[s]=0;
while(true)
{
int v=-1;
for(int u=1;u<=n;u++)
{
if(!used[u] && (v==-1 || d[u]<d[v]))
v=u;
}
if(v==-1)
break;
used[v]=true;
for(int u=1;u<=n;u++)
d[u]=min(d[u],d[v]+cost[v][u]);
}
}
int main()
{
int T;
scanf("%d%d",&T,&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cost[i][j]=INF;
for(int i=0;i<T;i++)
{
int u,v,len;
scanf("%d%d%d",&u,&v,&len);
{
if(len<cost[u][v])
{
cost[u][v]=len;
cost[v][u]=len;
}
}
}
dijkstra(n);
cout<<d[1]<<endl;
}
Frogger poj-2253
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<set>
#include<vector>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-10
#define PI acos(-1.0)
#define _e exp(1.0)
#define ll long long
const int maxn=205;
int x[maxn],y[maxn],n;
double map[maxn][maxn];
void floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=min(map[i][j],max(map[i][k],map[k][j]));
}
int main()
{
int ca=1;
while(~scanf("%d",&n) && n)
{
memset(map,0,sizeof(map));
for(int i=1;i<=n;i++)
{
scanf("%d %d",&x[i],&y[i]);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=map[j][i]=sqrt(double(x[i]-x[j])*(x[i]-x[j])+double(y[i]-y[j])*(y[i]-y[j]));
floyd();
printf("Scenario #%d\nFrog Distance = %.3lf\n\n",ca++,map[1][2]);
}
return 0;
}
Heavy Transportation poj-1797
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<queue>
using namespace std;
#define ll long long
#define llu unsigned long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
const int maxn=1005;
int map[maxn][maxn];
int n,m;
int dijkstra()
{
int vis[maxn],d[maxn];
int v;
for(int i=1;i<=n;i++)
{
vis[i]=0;
d[i]=map[1][i]; //d[]是最大承载量
}
for(int i=1;i<=n;i++)
{
int f=-1;
for(int j=1;j<=n;j++)
if(!vis[j] && d[j]>f)
{
f=d[j];
v=j;
}
vis[v]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j] && d[j]<min(d[v],map[v][j]))
d[j]=min(d[v],map[v][j]);
}
}
return d[n];
}
int main()
{
int t;
scanf("%d",&t);
int ca=1;
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
map[i][j]=0;
for(int i=0;i<m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
map[a][b]=map[b][a]=c;
}
printf("Scenario #%d:\n",ca++);
printf("%d\n\n",dijkstra());
}
}
Silver Cow Party poj-3268
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<queue>
using namespace std;
#define ll long long
#define llu unsigned long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
const int maxn = 1e3 + 5;
int cost[maxn][maxn];
bool used[maxn];
int d[maxn];
int ans[maxn];
int n, m, x;
void dijkstra(int s)
{
memset(d, INF, sizeof d);
memset(used, false, sizeof used);
d[s] = 0;
while (true)
{
int v = -1;
for (int u = 1; u <= n; u++)
if (!used[u] && (v == -1 || d[u] < d[v]))
v = u;
if (v == -1)
break;
used[v] = true;
for (int u = 1; u <= n; u++)
d[u] = min(d[u], d[v] + cost[v][u]);
}
}
int main()
{
ios::sync_with_stdio(false);
cin >> n >> m >> x;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cost[i][j] = INF;
for (int i = 0; i < m; i++)
{
int a, b, l;
cin >> a >> b >> l;
cost[a][b] = l;
}
dijkstra(x);
for (int i = 1; i <= n; i++)
{
ans[i] = d[i];
// cout << d[i] << endl;
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (i >= j)
swap(cost[i][j], cost[j][i]);
dijkstra(x);
int maxx = 0;
for (int i = 1; i <= n; i++)
maxx = max(ans[i] + d[i],maxx);
cout << maxx << endl;
}
Currency Exchange poj-1860
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define ll long long
const int maxn=1e2+5;
int n,m,s;
double v;
double g1[maxn][maxn]={0},g2[maxn][maxn]={0}; //g1:a->b汇率 g2:a->b佣金
double map[maxn]={0}; //在某一兑换点的金钱的数额
int floyd()
{
double d[maxn];
for(int i=1;i<=n;i++)
d[i]=map[i];
for(int k=1;k<=n;k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if ((map[i] - g2[i][j]) * g1[i][j] > map[j]) {
map[j] = (map[i] - g2[i][j]) * g1[i][j];
}
}
}
}
for(int i=1;i<=n;i++)
if(d[i]<map[i]) {
return 1;
}
return 0;
}
int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin>>n>>m>>s>>v; //n:货币的总数,m:兑换点的数目,s:手上钱的类型 v:手上钱的数目
for(int i=1;i<=m;i++)
{
int a,b;
double c,d,e,f;
cin>>a>>b>>c>>d>>e>>f;
g1[a][b]=c;
g2[a][b]=d;
g1[b][a]=e;
g2[b][a]=f;
}
map[s]=v;
floyd();
if(floyd())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
Wormholes poj-3259
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<queue>
using namespace std;
#define ll long long
#define llu unsigned long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
const int maxn = 1e5 + 5;
int map[505][505],n,m,k,num=0;
void Init()
{
memset(map,INF,sizeof map);
}
int floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int t = map[i][k]+map[k][j];
if(map[i][j] > t)
map[i][j]=t;
}
if(map[i][i]<0)
return 1;
}
return 0;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)
{
Init();
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
map[i][i]=0;
for(int i=1;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
if(c<map[a][b])
map[a][b]=map[b][a]=c;
}
for(int i=1;i<=k;i++)
{
int a,b,c;
cin>>a>>b>>c;
map[a][b]=-c;
}
if(floyd())
puts("YES");
else
puts("NO");
}
}
MPI Maelstrom poj-1502
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<queue>
using namespace std;
#define ll long long
#define llu unsigned long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
const int maxn = 1e5 + 5;
int dis[505];
bool vis[505];
int map[505][505],n,m,k,num=0;
void Init()
{
memset(map,INF,sizeof map);
for(int i=1;i<=n;i++)
map[i][i]=0;
}
void Dijkstra(int start)
{
for(int i=1;i<=n;i++)
{
dis[i]=INF;vis[i]=false;
}
dis[start]=0;
for(int j=1;j<=n;j++)
{
int k=-1;
int Min=INF;
for(int i=1;i<=n;i++)
if(!vis[i] && dis[i]<Min)
{
Min=dis[i];
k=i;
}
if(k==-1)
break;
vis[k]=true;
for(int i=1;i<=n;i++)
if(!vis[i] && dis[k]+map[k][i]<dis[i])
{
dis[i]=dis[k]+map[k][i];
}
}
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n;
Init();
for(int i=2;i<=n;i++)
for(int j=1;j<i;j++)
{
char str[10];
cin>>str;
if(str[0]!='x')
map[i][j]=map[j][i]=atoi(str);
}
Dijkstra(1);
int sum=0;
for(int i=2;i<=n;i++)
sum=max(sum,dis[i]);
cout<<sum<<endl;
}
Extended Traffic Lightoj-1074
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
const int MaxN=300;
const int MaxM=MaxN*MaxN;
const int INF=10e8;
struct Edge
{
int to,next,cost;
};
Edge E[MaxM];
int head[MaxN],Ecou;
bool vis[MaxN];
int couNode[MaxN];
bool cir[MaxN];
void init(int N)
{
Ecou=0;
for(int i=1;i<=N;++i)
head[i]=-1,vis[i]=0,cir[i]=0;
}
void addEdge(int u,int v,int c)
{
E[Ecou].to=v;
E[Ecou].cost=c;
E[Ecou].next=head[u];
head[u]=Ecou++;
}
void dfs(int u)
{
cir[u]=1;
for(int i=head[u];i!=-1;i=E[i].next)
if(!cir[E[i].to])
dfs(E[i].to);
}
bool SPFA(int lowcost[],int N,int start)
{
queue <int> que;
int u,v,c;
for(int i=1;i<=N;++i)
lowcost[i]=INF,couNode[i]=0;
lowcost[start]=0;
que.push(start);
vis[start]=1;
couNode[start]=1;
while(!que.empty())
{
u=que.front();
que.pop();
vis[u]=0; // !!!
for(int i=head[u];i!=-1;i=E[i].next)
{
v=E[i].to;
c=E[i].cost;
if(cir[v])
continue;
if(lowcost[v]>lowcost[u]+c)
{
lowcost[v]=lowcost[u]+c;
if(!vis[v])
{
vis[v]=1;
que.push(v);
++couNode[v];
if(couNode[v]>N)
dfs(v);
}
}
}
}
return 1;
}
int ans[MaxN];
int val[MaxN];
inline int cube(int x)
{
return x*x*x;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T;
int N,Q,M;
int a,b;
int cas=1;
scanf("%d",&T);
while(T--)
{
scanf("%d",&N);
init(N);
for(int i=1;i<=N;++i)
scanf("%d",&val[i]);
scanf("%d",&M);
while(M--)
{
scanf("%d %d",&a,&b);
addEdge(a,b,cube(val[b]-val[a]));
}
SPFA(ans,N,1);
scanf("%d",&Q);
printf("Case %d:\n",cas++);
while(Q--)
{
scanf("%d",&a);
if(cir[a] || ans[a]<3 || ans[a]==INF)
printf("?\n");
else
printf("%d\n",ans[a]);
}
}
return 0;
}
Cow Contest poj-3660
分析:floyd闭包,看每一头牛是否确定了赢的和输的加起来是n-1,是的话名次就确定了。(vj上g++rt了,c++就ac了)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include<map>
#include<cmath>
using namespace std;
#define ll long long
const int maxn=1e6+5;
const int INF = 0x3f3f3f3f;
int n,m;
int vis[105][105];
void Init()
{
memset(vis,0,sizeof vis);
}
void floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(vis[i][k]==1 && vis[k][j]==1)
vis[i][j]=1;
}
}
int main()
{
ios::sync_with_stdio(false);
while(~scanf("%d%d",&n,&m))
{
Init();
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
vis[a][b]=1;
}
floyd();
int ans=0;
for(int i=1;i<=n;i++)
{
int du=0;
for(int j=1;j<=n;j++)
{
if(vis[i][j]==1 || vis[j][i]==1)
du++;
}
if(du==n-1)
ans++;
}
cout<<ans<<endl;
}
}
Arbitrage poj-2240
分析:map存储字符串对应的编号
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<map>
#include<queue>
using namespace std;
#define ll long long
#define llu unsigned long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
const int maxn = 1e5 + 5;
int n;
double mp[60][60];
map<string,int>p;
void floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(mp[i][j]<mp[i][k]*mp[k][j])
mp[i][j]=mp[i][k]*mp[k][j];
return;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int ca=1;
while(~scanf("%d%*c",&n) && n)
{
p.clear();
for(int i=1;i<=n;i++)
{
char str[100];
scanf("%s",str);
p[str]=i;
mp[i][i]=1;
}
int m;
scanf("%d%*c",&m);
for(int i=1;i<=m;i++)
{
double a;
char str1[100],str2[100];
scanf("%s%lf%s",str1,&a,str2);
mp[p[str1]][p[str2]]=a;
}
floyd();
bool flag=false;
for(int i=1;i<=n;i++)
{
if(mp[i][i]>1)
{
flag=true;
break;
}
}
if(flag)
printf("Case %d: Yes\n",ca++);
else
printf("Case %d: No\n",ca++);
}
}
Invitation Cards poj-1511
分析:邻接表存储路径,正反向spfa,用vector寸可能会超时
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include<map>
#include <queue>
#include<vector>
#include<cmath>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f;
const int MAXN = 1e6+5;
struct edge
{
int to,w,nxt;
};
edge e[MAXN];
int n,cnt,head[MAXN],a1[MAXN],a2[MAXN],c[MAXN];
ll dis[MAXN];
void addedge(int u,int v,int w)
{
e[cnt].to=v;
e[cnt].w=w;
e[cnt].nxt=head[u];
head[u]=cnt++;
}
ll spfa()
{
fill(dis,dis+MAXN,INF);
queue<int>que;
que.push(1);
dis[1]=0;
while(!que.empty())
{
int u=que.front();
que.pop();
for(int i=head[u];i!=-1;i=e[i].nxt){
if(dis[e[i].to]>dis[u]+e[i].w){
dis[e[i].to]=dis[u]+e[i].w;
que.push(e[i].to);
}
}
}
ll res=0;
for(int i=1;i<=n;i++)
res+=dis[i];
return res;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
scanf("%d",&t);
while(t--)
{
int m;
scanf("%d%d",&n,&m);
cnt=0;
fill(head,head+MAXN,-1);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a1[i],&a2[i],&c[i]);
addedge(a1[i],a2[i],c[i]);
}
ll ans=spfa();
cnt=0;
fill(head,head+MAXN,-1);
for(int i=0;i<m;i++){
addedge(a2[i],a1[i],c[i]);
}
ans+=spfa();
printf("%lld\n",ans);
}
}
Candies poj-3159
分析:还是用邻接表存的路径,spfa用queue会超时,用vector也会超时,用栈的思想可以过,Dijkstra+优先队列也超时。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include<map>
#include <queue>
#include<vector>
#include<cmath>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f;
const int MAXN = 1e6+5;
struct edge
{
int to,w,nxt;
};
edge e[MAXN];
int n,cnt,head[MAXN];
bool vis[MAXN];
ll dis[MAXN];
void addedge(int u,int v,int w)
{
e[cnt].to=v;
e[cnt].w=w;
e[cnt].nxt=head[u];
head[u]=cnt++;
}
ll spfa()
{
fill(dis,dis+MAXN,INF);
int sta[MAXN];
memset(vis,false,sizeof vis);
queue<int>que;
que.push(1);
dis[1]=0;
int top=0;
sta[++top]=1;
vis[1]=true;
while(top)
{
int u=sta[top--];
vis[u]=false;
for(int i=head[u];i!=-1;i=e[i].nxt)
{
int v = e[i].to;
int w = e[i].w;
if(dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
if(!vis[v])
{
vis[v]=true;
sta[++top]= v;
}
}
}
}
}
int main()
{
int m;
scanf("%d%d",&n,&m);
cnt=0;
fill(head,head+MAXN,-1);
for(int i=0;i<m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);
}
spfa();
printf("%lld\n",dis[n]);
}
Subway poj-2502
分析:关键在于寸图
#include <stdio.h>
#include <math.h>
#define maxn 203
#define INF 1e8
#define min(a,b) (a<b?a:b)
#define distance(t,s) sqrt((t.x-s.x)*(t.x-s.x)+(t.y-s.y)*(t.y-s.y))
typedef struct{
int x,y;
}Point;
Point point[maxn],a;
int n;
double map[maxn][maxn];
int ex(Point t){
int i;
for(i=1;i<n;i++){
if(t.x==point[i].x && t.y==point[i].y) break;
}
if(i==n) point[n++]=t;
return i;
}
void dijkstra(){
int i,j,v,vis[maxn];
double min,d[maxn];
for(i=1;i<n;i++){
vis[i]=0;
d[i]=map[1][i];
}
for(i=1;i<n;i++){
min=INF;
for(j=1;j<n;j++)
if(!vis[j] && d[j]<min){
min=d[j];
v=j;
}
vis[v]=1;
for(j=1;j<n;j++)
if(!vis[j] && d[j]>map[v][j]+d[v])
d[j]=map[v][j]+d[v];
}
printf("%d\n",(int)(d[2]+0.5));
}
void floyd(){
int i,j,k;
for(k=1;k<n;k++)
for(i=1;i<n;i++)
for(j=1;j<n;j++)
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
int main(){
int subway[maxn],scnt;
int i,j,t;
for(i=1;i<maxn;i++)
for(j=1;j<maxn;j++)
if(i==j) map[i][j]=0;
else map[i][j]=INF;
n=1;
scanf("%d%d%d%d",&point[n].x,&point[n].y,&point[n+1].x,&point[n+1].y);
n+=2;
while(~scanf("%d%d",&a.x,&a.y)){
t=n;
scnt=0;
subway[scnt++]=ex(a); //要判断输入的点是否已经存在
while(scanf("%d%d",&a.x,&a.y) && (a.x!=-1 && a.y!=-1)){
subway[scnt++]=ex(a);
}
for(i=1;i<scnt;i++) //地铁的站的时间只能是相邻的站点能到,不能从站点1直接到站点n
map[subway[i]][subway[i-1]]=map[subway[i-1]][subway[i]]=distance(point[subway[i]],point[subway[i-1]])*3.0/2000.0;
}
for(i=1;i<n;i++)
for(j=1;j<=i;j++)
map[i][j]=map[j][i]=min(map[i][j],distance(point[i],point[j])*3.0/500.0);
dijkstra();//flpyd()
return 0;
}
昂贵的聘礼 poj-1062
分析:在于存图和建立一个新的源点
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include <vector>
#include<queue>
using namespace std;
#define ll long long
#define llu unsigned long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
const int maxn = 3e5+5;
const ll mod = 1e9+7;
int n,m;
int map[105][105];
int dis[105];
int money[105];
int level[105];
int minLevel;
int vis[105];
void init()
{
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
map[i][j]=(i==j?0:INF);
}
void Dijkstra()
{
for(int i=0;i<n;i++)
{
int minn=INF;
int u=-1;
for(int j=1;j<=n;j++) {
if (level[j] < minLevel || level[j] - minLevel > m)
continue;
if (dis[j] < minn && !vis[j]) {
minn = dis[j];
u = j;
}
}
if(u==-1)
break;
vis[u]=1;
for(int j=1;j<=n;j++)
{
if(level[j] < minLevel || (level[j]-minLevel > m))
continue;
if(!vis[j] && dis[j]>dis[u]+map[u][j])
dis[j] = dis[u]+map[u][j];
}
}
}
int main()
{
cin>>m>>n;
init();
for(int i=1;i<=n;i++)
{
int a;
cin>>money[i]>>level[i]>>a;
for(int j=0;j<a;j++)
{
int b,c;
cin>>b>>c;
map[b][i]=c;
}
map[0][i]=money[i];
}
int ans=INF;
for(int i=1;i<=n;i++)
{
minLevel=level[i];
for(int j=1;j<=n;j++)
dis[j]=map[0][j];
dis[0]=0;
memset(vis,0,sizeof vis);
vis[0]=1;
Dijkstra();
if(ans>dis[1])
ans=dis[1];
}
cout<<ans<<endl;
}
/*
1 4
10000 3 2
2 8000
3 5000
1000 2 1
4 200
3000 2 1
4 200
50 2 0
*/
Tram poj-1847
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<stack>
#include<cstdlib>
#include <vector>
#include<queue>
using namespace std;
#define ll long long
#define llu unsigned long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
const int maxn = 1e5;
const ll mod = 1e9+7;
struct node
{
int u,v,len,next;
}e[maxn];
int dis[maxn],head[maxn];
bool vis[maxn];
void addedge(int u,int v,int len,int k)
{
e[k].u = u;
e[k].v = v;
e[k].len = len;
e[k].next = head[u];
head[u] = k;
}
void spfa(int s)
{
stack<int> sta;
sta.push(s);
while(sta.size())
{
int i=sta.top();
sta.pop();
vis[i] = false;
for(int j=head[i];j!=0;j=e[j].next)
{
int u=e[j].u,v=e[j].v,len=e[j].len;
if(dis[u]+len < dis[v])
{
dis[v] = dis[u]+len;
if(vis[v] == false)
{
vis[v]=true;
sta.push(v);
}
}
}
}
}
int main()
{
int N,A,B,k = 1;
cin>>N>>A>>B;
memset(head,0,sizeof head);
for(int i=1;i<=N;i++)
{
int M,v;
dis[i] = INF;
cin>>M>>v;
addedge(i,v,0,k++);
for(int j=1;j<M;j++)
{
cin>>v;
addedge(i,v,1,k++);
}
}
dis[A] = 0;
spfa(A);
if(dis[B] == INF)
cout<<-1<<endl;
else
cout<<dis[B]<<endl;
}
/*
3 2 1
2 2 3
2 3 1
2 1 2
*/