HDU 3664 最短路
纯最短路 借这个题整理一下三种最短路方法
dijkstra代码:
#include<iostream>
#include<cstdio>
#define inf 999999;
using namespace std;
int dist[12],map[12][12],sea[12];
int N;
void dijkstra(int x)
{
int i,j,min,mark;
for(i=1;i<N;i++)
{
dist[i]=inf;
dist[i]=map[x][i];
}
for(i=1;i<N;i++)//控制次数,怎么感觉跟prim一样呢
{
min=inf;
for(j=0;j<N;j++)
if(dist[j]&&min>dist[j])
{
min=dist[j];
mark=j;
}
dist[mark]=0;
for(j=0;j<N;j++)
{
if(dist[j]>map[mark][j])
dist[j]=map[mark][j];
if(map[x][j]>map[x][mark]+map[mark][j])
map[x][j]=map[x][mark]+map[mark][j];
}
}
}
int main()
{
int i,n,j,k;
while(~scanf("%d",&N))
{ for(k=0;k<N;k++)
for(j=0;j<N;j++)
{
if(k==j) map[k][j]=0;
else map[k][j]=inf;
}
for(i=0;i<N;i++)
{
scanf("%d%d",&n,&sea[i]);
for(j=1;j<=n;j++)
{
scanf("%d",&k);
scanf("%d",&map[i][k]);
}
}
dijkstra(0);
int 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;
}
floydd代码:
#include<iostream>
#include<cstdio>
#define inf 999999;
using namespace std;
int map[12][12],sea[12];
int N;
void floyd(int x)
{
int i,j,k;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
for(k=0;k<N;k++)
{
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
return ;
}
int main()
{
int i,n,j,k;
while(~scanf("%d",&N))
{ for(k=0;k<N;k++)
for(j=0;j<N;j++)
{
if(k==j) map[k][j]=0;
else map[k][j]=inf;
}
for(i=0;i<N;i++)
{
scanf("%d%d",&n,&sea[i]);
for(j=1;j<=n;j++)
{
scanf("%d",&k);
scanf("%d",&map[i][k]);
}
}
floyd(0);
int 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;
}
spfa代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#define inf 1<<30
#include<queue>
using namespace std;
int dist[12],visit[12],sea[12],head[12];
int N,sum_edge;
struct Edge
{
int u,v,w,next;
}edge[1008];
void addedge(int x,int y,int W)
{
sum_edge++;
edge[sum_edge].u=x;
edge[sum_edge].v=y;
edge[sum_edge].w=W;
edge[sum_edge].next=head[x];
head[x]=sum_edge;
}
void spfa(int x)
{
int i,j,k;
queue<int>qu;
memset(dist,127,sizeof(dist));
memset(visit,0,sizeof(visit));
dist[x]=0;
visit[x]=1;
qu.push(x);
while(!qu.empty())
{
int star,e;
star=qu.front();
qu.pop();
e=head[star];
while(e)
{
int vv=edge[e].v;
if(dist[vv]>dist[star]+edge[e].w)
{
dist[vv]=dist[star]+edge[e].w;
if(!visit[vv])
{
visit[vv]=1;
qu.push(vv);
}
}
e=edge[e].next;
}
visit[star]=0;
}
}
int main()
{
int i,k,n;
while(~scanf("%d",&N))
{
sum_edge=0;
memset(head,0,sizeof(head));
for(k=0;k<N;k++)
{
scanf("%d%d",&n,&sea[k]);
while(n--)
{
int jj,len;
scanf("%d%d",&jj,&len);
addedge(k,jj,len);
}
}
spfa(0);
int MIN=inf,mark=0;
for(i=1;i<N;i++)
if(MIN>dist[i]&&sea[i])
{
MIN=dist[i];
mark=i;
}
printf("%d\n",dist[mark]);
}
return 0;
}

浙公网安备 33010602011771号