#include <cstdio>
#include <queue>
using namespace std;
int main()
{
queue<int>q;
int book[101];//标记某个点是否已经在队列中了(如果已经在队列中就不需要在将其入队了)
int first[101];
int next[101];
int u[101];
int v[101];
int s[101];
int dis[101];//储存1到其它点的距离
int i,j,n,m,k;
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
{
first[i]=-1;
book[i]=0;
dis[i]=9999;
}
book[1]=1;//这里如果是其他节点修改即可(也可以读入是某个节点到其余点的距离)
dis[1]=0;
for (i=1;i<=m;i++)
{
scanf("%d%d%d",&u[i],&v[i],&s[i]);
next[i]=first[u[i]];//邻接表的储存方式
first[u[i]]=i;
}
q.push(1);
while(!q.empty())
{
k=first[q.front()];//k是邻接表中第一个与1相连的首个点
while(k!=-1)
{
if (dis[v[k]]>dis[u[k]]+s[k])//如果通过k数据可以优化
{
dis[v[k]]=dis[u[k]]+s[k];
if (book[v[k]]==0)//如果v[k]不在队列中,就将它放入队列中,这里就是优化的地方,因为只有已经改变过的值才有可能引起下一次其他值经过它来改变,即不需要扫描所有的点)
{
q.push(v[k]);//注意是v[k]~~,不是k,因为这里是通过v[k]来优化的
book[v[k]]=1;
}
}
k=next[k];//扫描邻接表的下一个
}
q.pop();
}
for (i=1;i<=n;i++)
printf("%d ",dis[i]);
return 0;
}
#include <queue>
using namespace std;
int main()
{
queue<int>q;
int book[101];//标记某个点是否已经在队列中了(如果已经在队列中就不需要在将其入队了)
int first[101];
int next[101];
int u[101];
int v[101];
int s[101];
int dis[101];//储存1到其它点的距离
int i,j,n,m,k;
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
{
first[i]=-1;
book[i]=0;
dis[i]=9999;
}
book[1]=1;//这里如果是其他节点修改即可(也可以读入是某个节点到其余点的距离)
dis[1]=0;
for (i=1;i<=m;i++)
{
scanf("%d%d%d",&u[i],&v[i],&s[i]);
next[i]=first[u[i]];//邻接表的储存方式
first[u[i]]=i;
}
q.push(1);
while(!q.empty())
{
k=first[q.front()];//k是邻接表中第一个与1相连的首个点
while(k!=-1)
{
if (dis[v[k]]>dis[u[k]]+s[k])//如果通过k数据可以优化
{
dis[v[k]]=dis[u[k]]+s[k];
if (book[v[k]]==0)//如果v[k]不在队列中,就将它放入队列中,这里就是优化的地方,因为只有已经改变过的值才有可能引起下一次其他值经过它来改变,即不需要扫描所有的点)
{
q.push(v[k]);//注意是v[k]~~,不是k,因为这里是通过v[k]来优化的
book[v[k]]=1;
}
}
k=next[k];//扫描邻接表的下一个
}
q.pop();
}
for (i=1;i<=n;i++)
printf("%d ",dis[i]);
return 0;
}