题目分析:模板题:图论中求一个点到另外一个点的最短路径,利用spfa算法来做;
解题思路:
1、邻接表的应用
2、宽搜的使用(循环队列)
以下是ac代码:
#include<cstdio>
#include<cstring>
int n,m,st,len=0;
struct nod1{int v,h,q;}a[10010];
struct nod2{int x,y,c,gg;}b[500100];
void ins(int x,int y,int c) //建边
{
len++;
b[len].x=x; b[len].y=y; b[len].c=c;
b[len].gg=a[x].h; a[x].h=len;
}
int dl[10010],tou,wei;
void bfs()
{
tou=1,wei=2;
dl[tou]=st;a[st].v=1;
while(tou!=wei)
{
int x=dl[tou]; //当前的画家
for(int i=a[x].h;i>0;i=b[i].gg) //i是纸张
{
int y=b[i].y;
if(a[y].q>a[x].q+b[i].c)//询问更新
{
a[y].q=a[x].q+b[i].c;
if(a[y].v==0)//询问队列
{
a[y].v=1;dl[wei]=y;
wei++; if(wei>n) wei=1;
}
}
}
//当前画家完成了
a[x].v=0; tou++; if(tou>n) tou=1;
}
}
int main()
{
scanf("%d %d %d",&n,&m,&st);
for(int i=1;i<=n;i++) //对人的初始化
{
a[i].v=0; a[i].h=0; a[i].q=999999999;
}
for(int i=1;i<=m;i++)//处理邻居关系
{
int x,y,c;
scanf("%d %d %d",&x,&y,&c);
ins(x,y,c);
}
a[st].q=0;
bfs();
for(int i=1;i<=n;i++)
{
if(a[i].q==999999999) printf("2147483647 ");
else printf("%d ",a[i].q);
}
return 0;
}