HDU 3665 最短路 floyd
http://acm.hdu.edu.cn/showproblem.php?pid=3665
最短路
代码(spfa)
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#define nMAX 12
#define inf 1<<30
using namespace std;
int vs[nMAX],head[nMAX],dis[nMAX],sea[nMAX],qu[nMAX];
int n,s_edge;
struct Edge
{
int u,v,w,nxt;
}edge[nMAX*12*2];
void addedge(int u,int v,int w)
{
edge[++s_edge].v=v;
edge[s_edge].w=w;
edge[s_edge].nxt=head[u];
head[u]=s_edge;
edge[++s_edge].v=u;
edge[s_edge].w=w;
edge[s_edge].nxt=head[v];
head[v]=s_edge;
}
void spfa(int s)
{
int i,start=0,tail=0;
memset(vs,0,sizeof(vs));
for(i=0;i<n;i++)
dis[i]=inf;
dis[s]=0, vs[s]=1;
qu[tail++]=s;
while(start!=tail)
{
int u=qu[start++];
for(int e=head[u];e;e=edge[e].nxt)
{
int v=edge[e].v;
if(dis[v]>dis[u]+edge[e].w)//!!!
{
dis[v]=dis[u]+edge[e].w;//注意!!!
if(!vs[v])
{
qu[tail++]=v;//注意
vs[v]=1;
if(tail==nMAX)tail=0;
}
}
}
vs[u]=0;
if(start==nMAX)start=0;
}
}
int main()
{
int j,i,num,v,w;
while(~scanf("%d",&n))
{
memset(head,0,sizeof(head));
s_edge=0;
for(i=0;i<n;i++)
{
scanf("%d%d",&num,&sea[i]);
for(j=1;j<=num;j++)
{
scanf("%d%d",&v,&w);
addedge(i,v,w);
}
}
spfa(0);
int MIN=inf;
for(i=0;i<n;i++)
if(MIN>dis[i]&&sea[i])
{
MIN=dis[i];
}
printf("%d\n",MIN);
}
return 0;
}
floyd代码:
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#define inf 1<<20//1<<30就不对,计算中数越界??
#define nMAX 12
using namespace std;
int dis[nMAX],sea[nMAX],map[nMAX][nMAX];
int n;
void floyd()
{
int i,j,k;
for(k=0;k<n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
}
int main()
{
int i,j,sum,k,d;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
map[i][j]=inf;
map[i][i]=0;
}
for(i=0;i<n;i++)//êäèë
{
scanf("%d%d",&sum,&sea[i]);
for(j=1;j<=sum;j++)
{
scanf("%d%d",&k,&d);
map[i][k]=d;
map[k][i]=d;
}
}
floyd();
int mark,MIN=inf;
for(i=1;i<n;i++)
{
if(sea[i]&&MIN>map[0][i])
{
MIN=map[0][i];
}
}
printf("%d\n",MIN);
}
return 0;
}

浙公网安备 33010602011771号