链接
开始分析:
刚拿到题,不会做。
认真看题,有了一点思路:
既然更改一次就要花费一点时间,那么从U~V的距离不如设成1,在做一遍Floyed,不就好了吗
既然有思路,那就写吧
代码:
#include<iostream>
#include<cstring>
using namespace std;
int m,n,dis[200][200],a,b;
int main(){
cin>>n>>a>>b;
memset(dis,1,sizeof(dis));
for(int i=1;i<=n;i++){
int k;
cin>>k;
for(int j=1;j<=k;j++){
int x;
cin>>x;
if(j==1)dis[i][x]=0;//第一个不用更改
else dis[i][x]=1;
}
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
if(i!=j&&i!=k&&j!=k&&dis[i][j]>dis[i][k]+dis[k][j])
dis[i][j]=dis[i][k]+dis[k][j];
}
}
if(a==b)cout<<0;//特判(试一试不加怎么样)
else if(dis[a][b]!=16843009)cout<<dis[a][b];
else cout<<-1;
}