样例过,下载第一个测试点过,但是全re。。。
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int tot,n,m,s,head,tail,dis[10002],team[10002];
bool vis[10002];
struct qxx
{
int first,next,go,value;
}p[500002];
int star(int a,int b,int c)
{
p[++tot].next=p[a].first;
p[a].first=tot;
p[tot].go=b;
p[tot].value=c;
}
void spfa(int a)
{
memset(dis,0x3f,sizeof(dis));//最短距离初始化;
memset(vis,true,sizeof(vis));//判断是否入过队;
dis[a]=0;//初始化起点距离0;
team[tail]=a;//将初始结点入队;
vis[a]=false;
while(head<=tail)
{
int u=team[head++];//提出队首元素;
for(int i=p[u].first;i!=0;i=p[i].next)//遍历;
{
int z=p[i].go;
if(dis[u]+p[i].value<dis[z])//判断是否更新最短距离;
{
dis[z]=dis[u]+p[i].value;
//cout<<dis[z]<<endl;
if(vis[z]==true)//将遍历到的结点入队;
{
team[++tail]=z;
vis[z]=false;//防止二次入队;
}
}
}
}
}
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
star(x,y,z);
}
spfa(s);
for(int i=1;i<=n;i++)
{
if(dis[i]==0x3f)
cout<<(1<<31)-1<<" ";
else
cout<<dis[i]<<" ";
}
return 0;
}