社区讨论

SPFA 样例数据全对 然而0分

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

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mi5i67nm
此快照首次捕获于
2025/11/19 12:29
4 个月前
此快照最后确认于
2025/11/19 12:29
4 个月前
查看原帖
/* 4 5 1 2 4
1 3 1
1 4 3
2 4 1
2 3 2
*/
CPP
#include<iostream>
using namespace std;
int dui[100001];
int flag[10001];//在不在队列中做标记 
int front=1,wei=1;//队头队尾都是1 
int n,m;//顶点边
int qi;
int w[3001][3001]; //二维数据n*n 
int dis[10001];//起始点s到其他所有点的最短距离 
void push(int x)//入队尾 
{
dui[wei]=x;
wei++;//永远指向空位置 
}
int pop() //出队头 
{
int t=dui[front];
if(front==wei)  //队列为空返回特殊值 
 return  -99999;;
front++;//头后移
return t;    
}
//情况1:无权值的图:cin>>x>>y;a[x][y]=1 (之前初始化所有的a[i][j]=0)
//情况2:有权值的图;3步走:1步所有的都无穷大。2步对角线全是0.3步:读入w[x][y]=t; 
void read()
{  int i,j,x,y,t;
  cin>>n>>m;
  cin>>qi;
  //第1步:增加邻接矩阵w的初始化操作
 for(i=1;i<=n;i++)//初始化无穷大 
 for(j=1;j<=m;j++)
  w[i][j]=88888888; // {无边0,有边1}  有权值的{34,8888888} 
//第2步:对角线的问题,全是0!!! 
for(i=1;i<=n;i++)
w[i][i]=0;
//第3步:读入边权值  
for(i=1;i<=m;i++)//读m条边的信息
{
cin>>x>>y>>t;//读入起始点,结束点,权值 
 w[x][y]=t;//有向图 
//w[y][x]=t;//无向图  
 }
}
void spfa(int s) //以s为起始点,求dis[]数组 
{  int i,j,x,y;
 //初始化dis数组
 for(i=1;i<=n;i++)
 dis[i]=88888888;
 //自己到自己是0
 dis[s]=0;
push(s);//s起始点入队列
flag[s]=1;//一定要做队列标记 
while(front!=wei)//队列不空 
{//先出队列
CPP
x=pop();
flag[x]=0;//队列标记要清空    
for(y=1;y<=n;y++)//扫描所有的点
{
 if(w[x][y]!=88888888) //x->y有边相连 
   {
       if(dis[y]>dis[x]+w[x][y]) //到y的距离通过出队列的x变短
       {
           dis[y]=dis[x]+w[x][y];//先刷新,再看y在不在队列中 
        if(flag[y]==0)
        {    push(y);
        flag[y]=1;//做队列标记 
        }//end if flag[y]
       } //end if d
   }//end if w
else continue;
}//end for
}//end while
for(i=1;i<=n;i++)
cout<<dis[i]<<" "; 
}
int main()
{
read();
spfa(qi);
return 0;
}

回复

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

正在加载回复...