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;
}

  

posted @ 2012-01-22 01:48  快乐.  阅读(177)  评论(0编辑  收藏  举报