emmm....写给自己看的东西。。。请各位大佬给予帮助咯。。。桑代码!
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
typedef struct{
int to,q,next;
}fhs;//邻接链表~~~
int head[510000],dist[510000],x,y,z,c,w,u,en=0;//dist为最短路大小,head邻接链表需要记录的头部。
fhs pp[1001000];//建立表
bool bj[510000];//标记数组记录是否存入了其中
queue<int> q;//使用队列
const int o=2147483647;//最大值
void addd(int x,int y,int z)//添加方式
{
pp[en].next=head[x];//用next记录上一个已x为起点的路的位置
pp[en].q=z; //每条路的权值
pp[en].to=y; //到哪个位置
head[x]=en++; // 记录起点为这个位置的最后一个到达位置的数组下标(邻接链表,不解释了)
}
void ks()//初始输入
{
scanf("%d%d%d",&w,&u,&c);//输入(几个点,几条路,初始位置)
memset(head ,-1,sizeof(head));//赋值为-1,好结束
fill(dist,dist+u+1,o);//赋值为最大值,用于比较
fill(bj,bj+u+1,false);//全部赋值为未放入
for(int i=0;i<u;i++)//输入路的值
{
scanf("%d%d%d",&x,&y,&z);//x为初始位置,y为到达位置,z为权值
addd(x,y,z);//放入
}
dist[c]=0; //将初始位置的最小权值点位0(你不用走就到了不是吗?)
}
void spfa()//算法开始~
{
q.push(c);//放入初始位置
bj[c]=true;//将初始位置标记
while(!q.empty())//感觉特别像bfs。。。不过就是这样。。,开始遍历图
{
int uu=q.front();//首个
q.pop();//拿出
bj[uu]=false;//标记这个未录入。。(感觉像是在说废话)
for(int i=head[uu];i!=-1;i=pp[i].next)//利用邻接链表性质,不断追溯相同初始位置的上一条路
{
int vv=pp[i].to;//不想说。。。
if(dist[vv]>dist[uu]+pp[i].q)//当我从到现在位置的最小值加上移动到目标位置的值要小时,那就用替代它;
{
dist[vv]=dist[uu]+pp[i].q;//
if(!bj[vv])//防止重复
{
q.push(vv);//放入点
bj[vv]=true;//。。。
}
}
}
}
}
int main()
{
ks(); //初始
spfa(); // 算法
for(int i=1;i<=w;i++)//输出到每一个的最小值。。。
{
printf("%d",dist[i]);
if(i!=w)
{
printf(" ");
}
}
return 0;
}
感觉像是bfs。。。。是我的错觉吧。。。。