社区讨论

求求大佬帮忙看看代码的问题

P3371【模板】单源最短路径(弱化版)参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lobexyml
此快照首次捕获于
2023/10/29 19:54
2 年前
此快照最后确认于
2023/11/04 01:28
2 年前
查看原帖
CPP
#include <stdio.h>
#include <stdlib.h>
#define inf 9999
int vis[10005]={0};//标记
int dis[10005]={9999};//累计路程
int dis_point[10005][10005];
int point_direct[10005][10005];//用0 1表示点与点的路径存在与否
int n,m,s;
int check()
{
    for(int i=1;i<=n;i++)
    {
        if(!vis[i])
            return 0;
    }
    return 1;
}
void init_chart(int stx)
{
    vis[stx]=1;
    dis[stx]=0;
}
void dijkstra(int stx)
{
  if(check())
  {
    for(int i=1;i<=n;i++)
    printf("%d ",dis[i]);
  }
  else
  {
  for(int j=1;j<=n;j++)//更新部分
  {

    if(point_direct[stx][j]&&j!=stx&&!vis[j])
      {
 int temp_dis=dis_point[stx][j]+dis[stx];
      if(temp_dis<dis[j])
      {
          dis[j]=temp_dis;
      }
      }
  }
  int min=inf,pos=1;
  for(int i=1;i<=n;i++)
  {
      if(dis[i]<min&&!vis[i]&&i!=stx)
      {
          min=dis[i];
          pos=i;
      }
  }//找到已经找到的节点的最小的那个
   vis[pos]=1;
   dijkstra(pos);
  }
}
int main()
{
  memset(point_direct,0,sizeof(point_direct));
  scanf("%d %d %d",&n,&m,&s);
  int u,v,w,temp=m;
  while(temp--)
  {
      scanf("%d %d %d",&u,&v,&w);
      dis_point[u][v]=w;
      point_direct[u][v]=1;
  }
  init_chart(s);
  dijkstra(s);
}

回复

2 条回复,欢迎继续交流。

正在加载回复...