版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
计蒜客习题:最短路简化版
题目
样例
思路
邻接矩阵+dijkstra。
代码
#include<iostream>
using namespace std;
const int maxn=1010;
const int inf=0x3f3f3f;
int mp[maxn][maxn],l[maxn],v[maxn],n,m;
void init()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==j) mp[i][j]=0;
else mp[i][j]=inf;
}
void dijkstra(int from)
{
int i;
for(i=1;i<=n;i++)
{
v[i]=0;
l[i]=mp[from][i];
}
int j;
for(i=1;i<n;++i)
{
int min=inf,pos;
for(j = 1 ; j <= n ; ++j)
if(!v[j]&&min>l[j])
{
pos=j;
min=l[j];
}
v[pos]=1;
for(j=1;j<=n;++j)
if(!v[j]&&(l[j]>(l[pos]+mp[pos][j])))
l[j]=l[pos]+mp[pos][j];
}
return;
}
int main()
{
int c;
scanf("%d %d %d",&n,&m,&c);
init();
while(m--)
{
int x,y;
scanf("%d %d",&x,&y);
mp[x][y]=mp[y][x]=1;
}
dijkstra(c);
for(int i=1;i<=n;i++)
printf("%d\n",l[i]);
return 0;
}