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

  



posted @ 2011-11-19 19:38  快乐.  阅读(175)  评论(0编辑  收藏  举报