题意:在一个有向图中,有很多个点,他们之间的距离要么是0,要么是1,要么是不存在,求某点到某点的最短距离
我直接套模板啦,真是非常迅捷
#include<iostream>
#include<string>
#include<cmath>
#define M 105
#define INF 999999
using namespace std;
int d[M],vis[M],dis[M][M],n,flag;
void Dijkstra(int x) //x是起点
{
int i,min,select,j;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++) //初始化,除了d[自己]是0,其他均为最大值
d[i]=INF;
d[x]=0;
for(i=1;i<=n;i++)
{
min=INF;
for(j=1;j<=n;j++)
if(vis[j]==0&&d[j]<min) //选出d值最小的节点
{
min=d[j];
select=j;
}
if(min==INF) return ; //如果找不到min了提早退出
vis[select]=1; //标记
for(j=1;j<=n;j++) //松弛操作
if(!vis[j]&&d[select]+dis[select][j]<d[j])
d[j]=d[select]+dis[select][j];
}
}
int main()
{
int a,b,i,j,m,x;
scanf("%d%d%d",&n,&a,&b);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j)
dis[i][j]=0;
else dis[i][j]=INF;
for(i=1;i<=n;i++)
{
scanf("%d",&m);
for(j=0;j<m;j++)
{
scanf("%d",&x);
if(j==0) //只有第一个的距离为0,后面的都为1
dis[i][x]=0;
else dis[i][x]=1;
}
}
Dijkstra(a);
if(d[b]<INF)
printf("%d\n",d[b]);
else
printf("-1\n");
}