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

来源:互联网 发布:网络流行文化的研究 编辑:程序博客网 时间:2024/06/05 21:53

dijkstra的模板题,除去有重复边这个坑点。
对于图的存储,我使用两种方式,邻接矩阵和邻接表,而邻接表的实现又有多种方式。
之前用数组模拟,好久不写,也忘了..懒得捡起来,用新方法 vector还真是方便。

#include<cstdio>#include<cstring>#define inf 1<<29using 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[N]);    }}

邻接表,数组模拟,优点:没有任何多余空间,缺点:规则半年不用忘了…

Memory: 476 KB Time: 32 MS

#include<cstdio>#include<cstring>#include<algorithm>#define inf 1<<29using 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[N]);    }}

Vector 实现邻接表。优点:方便啊 !代码小,不易犯错误!

#include<cstdio>#include<cstring>#include<vector>#include<iostream>const int inf=1<<29;using namespace std;const int maxn=1010;typedef struct EdgeNode{    int to,w;}node;int v[maxn],dist[maxn],n,m;vector<node>M[maxn];void dijkstra(){    memset(v,0,sizeof(v));    v[1]=1;    for(int i=1;i<=n;i++) dist[i]=inf;    for(vector<node>::iterator it=M[1].begin();it!=M[1].end();it++){        node t=*it;        dist[t.to]=min(t.w,dist[t.to]);    }    for(int i=2;i<=n;i++){        int minn=inf,index;        for(int j=1;j<=n;j++){            if(!v[j]&&minn>dist[j]){                minn=dist[j];                index=j;            }        }        v[index]=1;        for(vector<node>::iterator it=M[index].begin();it!=M[index].end();it++){            node t=*it;            if(!v[t.to]&&dist[t.to]>dist[index]+t.w) dist[t.to]=dist[index]+t.w;        }    }}int main(){   while(~scanf("%d%d",&m,&n)){      for(int i=0;i<m;i++){          int a,b,c; scanf("%d%d%d",&a,&b,&c);          M[a].push_back(node{b,c});          M[b].push_back(node{a,c});      }      dijkstra();      printf("%d\n",dist[n]);   }}
1 0
原创粉丝点击