HDU

来源:互联网 发布:河南安全教育网络平台 编辑:程序博客网 时间:2024/06/05 06:43

题目链接:https://vjudge.net/problem/HDU-2544

题意详见题目链接。

分析:很直白的一道题,就是求一个无向图的最短路径。多种方法都可以求。BFS,Dijkstra(迪杰斯特拉)算法,Floyd算法都可以求解。关于两种算法,可详见此链接。(写的很好,尤其是图做得好,一目了然,看一遍就知道这种算法的思路,强烈建议看一看)。

BFS版:

#include<cstdio>#include<cstring>#include<iostream>#include<queue>#include<algorithm>using namespace std;const int INF=0x3f3f3f3f;const int maxn=1e5+5;int num,n,m;int head[1005];struct Edge{    int from,to,val,next;}edge[maxn];void init(){    num=0;    memset(head,-1,sizeof(head));}void addedge(int u,int v,int w){    Edge E={u,v,w,head[u]};    edge[num]=E;    head[u]=num++;}queue<int> q;int dist[1005];void BFS(int st){     memset(dist,INF,sizeof(dist));    q.push(st);    dist[1]=0;    while(!q.empty()){        int u=q.front();q.pop();        for(int i=head[u];i!=-1;i=edge[i].next){            int v=edge[i].to;            if(dist[v]>dist[u]+edge[i].val){                dist[v]=dist[u]+edge[i].val;                q.push(v);            }        }    }}int main(){    //freopen("in.txt","r",stdin);    while(scanf("%d%d",&n,&m)&&(n||m)){        init();        int a,b,c;        for(int i=0;i<m;i++){            scanf("%d%d%d",&a,&b,&c);            addedge(a,b,c);            addedge(b,a,c);//用邻接表存储        }        BFS(1);        printf("%d\n",dist[n]);    }    return 0;}

Dijkstra版:

#include<cstdio>#include<cstring>#include<iostream>#include<queue>#include<algorithm>using namespace std;const int INF=0x3f3f3f3f;const int maxn=1e5+5;int mp[110][110],dist[110],vis[110];void Dijkstra(int n,int st){    for(int i=1;i<=n;i++)        dist[i]=mp[1][i];    vis[st]=1;    for(int i=1;i<=n;i++){        int p,_min=INF;        for(int j=1;j<=n;j++){            if(!vis[j]&&dist[j]<_min){                p=j;                _min=dist[j];            }        }        vis[p]=1;        for(int j=1;j<=n;j++){            if(!vis[j]&&dist[p]+mp[p][j]<dist[j]){                dist[j]=dist[p]+mp[p][j];            }        }    }}int main() {    //freopen("in.txt","r",stdin);    int n,m;    while(scanf("%d%d",&n,&m)&&(n||m)){        memset(mp,INF,sizeof(mp));        memset(vis,0,sizeof(vis));        int a,b,c;        for(int i=1;i<=m;i++){            scanf("%d%d%d",&a,&b,&c);            mp[a][b]=mp[b][a]=c;        }        Dijkstra(n,1);        printf("%d\n",dist[n]);    }    return 0;}

floyd 版:

#include<cstdio>#include<cstring>#include<iostream>#include<queue>#include<algorithm>using namespace std;const int INF=0x3f3f3f3f;const int maxn=1005;int dist[maxn][maxn];int main() {    //freopen("in.txt","r",stdin);    int n,m;    while(scanf("%d%d",&n,&m)&&(n||m)) {        memset(dist,INF,sizeof(dist));        int a,b,c;        for (int i=0; i<m; i++) {            scanf("%d%d%d",&a,&b,&c);            dist[b][a]=dist[a][b]=c;        }        for (int k=1; k<=n; k++) {            for (int i=1; i<=n; i++) {                for (int j=1; j<=n; j++) {                    dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);                }            }        }        printf("%d\n",dist[1][n]);    }    return 0;}

原创粉丝点击