#include"iostream"
#include"cstdio"
#include"cstdlib"
#include"cstring"
#include"queue"
using namespace std;
int u[70005];
int v[70005];
int w[70005];
int first[105];
int nextk[20010];
int n,m;
int a,b,c;
int book[105];
int dis[105];
void spfa()
{
std::queue<int> q;
q.push(1);
book[1]=1;
while(!q.empty())
{
int k=first[q.front()];
book[q.front()]=0;
q.pop();
while(k!=-1)
{
if(dis[v[k]]>dis[u[k]]+w[k])
{
dis[v[k]]=dis[u[k]]+w[k];
if(book[v[k]]==0)
{
q.push(v[k]);
book[v[k]]=1;
}
}
k=nextk[k];
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)==2&&n!=0&&m!=0)
{
for(int i=1;i<=m;i++)
{
cin>>u[i]>>v[i]>>w[i];
}
for(int i=m+1;i<=2*m;i++)
{
u[i]=v[i-m];
v[i]=u[i-m];
w[i]=w[i-m];
}
memset(first,-1,sizeof(first));
memset(nextk,0,sizeof(nextk));
for(int i=1;i<=2*m;i++)
{
nextk[i]=first[u[i]];
first[u[i]]=i;
}
for(int i=1;i<=n;i++)
{
dis[i]=9999999;
}
dis[1]=0;
spfa();
cout<<dis[n]<<endl;
}
return 0;
}
这道题万分小心,邻接表对于无向图的话,要小心RE 数组越界,u,v,w数组中下标代表的是边数不是点数
HDU2544 spfa
最新推荐文章于 2022-09-21 16:00:07 发布