您的位置:首页 > 其它

poj2387 Til the Cows Come Home(邻接矩阵,邻接表)

2015-08-08 12:13 316 查看
最基础的最短路问题模板题,(我用的dijkstra算法)非常适合我学习使用如何用邻接表存图(之前都是邻接矩阵),太弱了,暑假过一半,现在才刚窥初仪,不过话说邻接表在边比较少的情况下真的很节省空间。

邻接矩阵

对于邻接矩阵,这题有重边,加一个判重,存重边中短的。

Memory: 4480 KB Time: 63 MS

[code]#include<cstdio>
#include<cstring>
#define inf 1<<29
using namespace std;
int M[1050][1050],T,N,dist[1050];
bool visit[1050];
void dijkstra()
{
    memset(visit,false,sizeof(visit));
    for(int i=1;i<=N;i++)
        dist[i]=M[1][i];
    visit[1]=true;
    for(int i=2;i<=N;i++)
    {
        int Min=inf,index;
        for(int j=1;j<=N;j++)
        {
            if(visit[j]==false&&dist[j]<Min)
            {
                index=j;
                Min=dist[j];
            }
        }
        visit[index]=true;
        for(int j=1;j<=N;j++)
        {
            if(visit[j]==false&&dist[j]>dist[index]+M[index][j])
                dist[j]=dist[index]+M[index][j];
        }
    }
}

int main()
{
    while(~scanf("%d %d",&T,&N))
    {
        for(int i=1;i<=N;i++)
         for(int j=1;j<=N;j++)
         if(i==j) M[i][j]=0;
          else M[i][j]=inf;
         for(int i=1;i<=T;i++)
         {
             int a,b,c;
             scanf("%d %d %d",&a,&b,&c);
             if(M[a][b]>c)
             M[a][b]=M[b][a]=c;
         }
         dijkstra();
         printf("%d\n",dist
);
    }
}


邻接表(用数组模拟)

对于邻接表,写法稍与邻接矩阵不同,这里dist初始化并不是存起始点到各个边的距离,而是都初始化无穷大。然后这里最初是先用起始点松弛(其实是找离起始点最短的边,有重边也没关系),再找最短边加入,再用这个最短边到达的点去松弛其他边。所以这里松弛的作用,起到去重边也能把最短边入dist数组。(我的理解,有误可以交流)

Memory: 476 KB Time: 32 MS

[code]#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 1<<29
using namespace std;
const int maxn=4050;
int u[maxn],v[maxn],w[maxn],first[maxn],next[maxn],T,N,dist[maxn];
bool visit[maxn];
void dijkstra()
{
    memset(visit,false,sizeof(visit));
    for(int i=1;i<=N;i++)
    dist[i]=inf;
    dist[1]=0;
    visit[1]=true;
    int Min,index=1;
    for(int i=2;i<=N;i++)
    {
        for(int j=first[index];j!=-1;j=next[j])
        {
           if(visit[v[j]]==false&&dist[index]+w[j]<dist[v[j]])
            dist[v[j]]=dist[index]+w[j];
        }
        Min=inf;
        for(int j=1;j<=N;j++)
        {
            if(visit[j]==false&&dist[j]<Min)
            {
                index=j;
                Min=dist[j];
            }
        }
        visit[index]=true;
    }
}

int main()
{
    while(~scanf("%d %d",&T,&N))
    {
         memset(first,-1,sizeof(first));
         memset(next,-1,sizeof(next));
         for(int i=1;i<=T*2;i+=2)
         {
            int a,b,c;
            scanf("%d %d %d",&a,&b,&c);
            u[i]=v[i+1]=a,v[i]=u[i+1]=b,w[i]=w[i+1]=c;//无向边,双向存。
            next[i]=first[u[i]],next[i+1]=first[u[i+1]];
            first[u[i]]=i,first[u[i+1]]=i+1;
         }
         dijkstra();
         printf("%d\n",dist
);
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: