HDU 2544 最短路(多种解法)

来源:互联网 发布:阿国网络随笔博客 编辑:程序博客网 时间:2024/06/07 20:23

最短路

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 72444    Accepted Submission(s): 31637


Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

 

Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
 

Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
 

Sample Input
2 11 2 33 31 2 52 3 53 1 20 0
 

Sample Output
32
 

Source
UESTC 6th Programming Contest Online
 

Recommend
lcy   |   We have carefully selected several similar problems for you:  2066 1874 1217 2112 1142 
 


题意:
输出从1到n的最短距离。
解题思路:
用了dijkstra+邻接矩阵,dijkstra+优先队列STL,floyd三种方法水过。
dijkstra+邻接矩阵代码
#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>using namespace std;#define maxn 105#define inf 0x3f3f3f3fint n,m;int flag[maxn],dis[maxn],w[maxn][maxn];void dijkstra(){    for(int i=1; i<=n; i++)        dis[i]=(i==1?0:inf);    memset(flag,0,sizeof(flag));    for(int i=0; i<n; i++)    {        int cur,tmp=inf;        for(int j=1; j<=n; j++)            if(!flag[j]&&dis[j]<=tmp)                tmp=dis[cur=j];        flag[cur]=1;        for(int i=1; i<=2*n; i++)            dis[i]=min(dis[i],dis[cur]+w[cur][i]);    }}int main(){    //freopen("in.txt","r",stdin);    while(cin>>n>>m&&n+m)    {        memset(w,inf,sizeof(w));        int x,y,t;        for(int i=0; i<m; i++)        {            cin>>x>>y>>t;            w[x][y]=w[y][x]=t;        }        dijkstra();        printf("%d\n",dis[n]);    }    return 0;}

dijkstra+优先队列STL
#include<stdio.h>#include<iostream>#include<string.h>#include<queue>#include<vector>using namespace std;#define maxn 1005#define inf 0x3f3f3f3fstruct node{    int to,val;    node() {}    node(int a,int b)    {        to=a;        val=b;    }    friend bool operator <(node a,node b)    {        return a.val<b.val;    }};int n,m;vector<node> v[maxn];int d[maxn];void dijkstra(int s){    priority_queue<node> q;    memset(d,inf,sizeof(d));    d[s]=0;    q.push(node(s,d[s]));    while(!q.empty())    {        node x=q.top();        q.pop();        for(int i=0; i<v[x.to].size(); i++)        {            node y=v[x.to][i];            if(d[y.to]>x.val+y.val)            {                d[y.to]=x.val+y.val;                q.push(node(y.to,d[y.to]));            }        }    }}int main(){    //freopen("in.txt","r",stdin);    while(~scanf("%d%d",&n,&m)&&n+m)    {        for(int i=0; i<=n; i++)            v[i].clear();        int a,b,c;        for(int i=0; i<m; i++)        {            scanf("%d%d%d",&a,&b,&c);            v[a].push_back(node(b,c));            v[b].push_back(node(a,c));        }        dijkstra(1);        printf("%d\n",d[n]);    }    return 0;}


dijkstra+head+链式前向星(最快)
#include<stdio.h>#include<iostream>#include<string.h>#include<queue>using namespace std;#define maxn 1005#define inf 0x3f3f3f3fstruct edge{    int to,val,next;} edges[maxn*maxn];struct node{    int to,val;    node() {}    node(int a,int b)    {        to=a;        val=b;    }    friend bool operator<(node a,node b)    {        return a.val>b.val;    }};int head[maxn],d[maxn],flag[maxn];int n,m,cnt;void add(int u,int v,int w){    edges[cnt].to=v;    edges[cnt].val=w;    edges[cnt].next=head[u];    head[u]=cnt++;}void dijkstra(){    priority_queue<node> q;    memset(flag,0,sizeof(flag));    memset(d,inf,sizeof(d));    d[1]=0;    q.push(node(1,0));    while(!q.empty())    {        node x=q.top();        q.pop();        if(flag[x.to]) continue;        flag[x.to]=1;        for(int i=head[x.to]; ~i; i=edges[i].next)        {            int cur=edges[i].to;            int value=edges[i].val;            if(d[cur]>d[x.to]+value)            {                d[cur]=d[x.to]+value;                q.push(node(cur,d[cur]));            }        }    }    printf("%d\n",d[n]);}int main(){    //freopen("in.txt","r",stdin);    while(cin>>n>>m&&n+m)    {        memset(head,-1,sizeof(head));        cnt=0;        int a,b,c;        for(int i=0; i<m; i++)        {            scanf("%d%d%d",&a,&b,&c);            add(a,b,c);            add(b,a,c);        }        dijkstra();    }    return 0;}


floyd算法
#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>using namespace std;#define maxn 1005#define inf 0x3f3f3f3fint n,m;int val[maxn][maxn];void floyd(){    for(int k=1; k<=n; k++)        for(int i=1; i<=n; i++)            for(int j=1; j<=n; j++)                val[i][j]=min(val[i][j],val[i][k]+val[k][j]);}int main(){    //freopen("in.txt","r",stdin);    while(~scanf("%d%d",&n,&m)&&n+m)    {        memset(val,inf,sizeof(val));        int a,b,c;        for(int i=0; i<m; i++)        {            scanf("%d%d%d",&a,&b,&c);            val[a][b]=val[b][a]=c;        }        floyd();        printf("%d\n",val[1][n]);    }    return 0;}




原创粉丝点击