【HDU

来源:互联网 发布:adobe pdf 电脑软件 编辑:程序博客网 时间:2024/06/05 16:59

A - 最短路


在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的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

题意:有n个路口,m条路,通过一条路的花费为c,问从点1到点n的最小花费是多少。


分析:最基础的最短路,下面给出dijkstra和spfa两种做法。


代码如下:


dijkstra做法:

#include <map>#include <cmath>#include <queue>#include <stack>#include <vector>#include <cstdio>#include <string>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define INF 0x3f3f3f3fusing namespace std;const int MX = 105;int mp[MX][MX];int dis[MX];int vis[MX];int n, m;void dijkstra(int s){    memset(vis, 0, sizeof(vis));    memset(dis, INF, sizeof(dis));    dis[s] = 0;    for(int i = 1; i <= n; i++){        int mindis = INF, k = -1;        for(int j = 1; j <= n; j++){            if(!vis[j] && dis[j] < mindis){                mindis = dis[j];                k = j;            }        }        vis[k] = 1;        for(int j = 1; j <= n; j++){            if(dis[j] > dis[k] + mp[k][j]){                dis[j] = dis[k] + mp[k][j];            }        }    }}int main(){    while(~scanf("%d%d", &n, &m), n || m){        memset(mp, INF, sizeof(mp));        for(int i = 0; i < m; i++){            int u, v, s;            scanf("%d%d%d", &u, &v, &s);            mp[u][v] = mp[v][u] = s;        }        dijkstra(1);        printf("%d\n", dis[n]);    }    return 0;}


spfa做法:

#include <map>#include <cmath>#include <queue>#include <stack>#include <vector>#include <cstdio>#include <string>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define INF 0x3f3f3f3fusing namespace std;const int MX = 105;int mp[MX][MX];int dis[MX];int inq[MX];int n, m;void spfa(int s){    memset(dis, INF, sizeof(dis));    memset(inq, 0, sizeof(inq));    queue<int> q;    q.push(s);    inq[s] = 1;    dis[s] = 0;    while(!q.empty()){        int u = q.front();        q.pop();        inq[u] = 0;        for(int i = 1; i <= n; i++){            if(dis[i] > dis[u] + mp[u][i]){                dis[i] = dis[u] + mp[u][i];                if(!inq[i]){                    q.push(i);                    inq[i] = 1;                }            }        }    }    printf("%d\n", dis[n]);}int main(){    while(~scanf("%d%d", &n, &m), n || m){        memset(mp, INF, sizeof(mp));        for(int i = 1; i <= m; i++){            int u, v, c;            scanf("%d%d%d", &u, &v, &c);            mp[u][v] = mp[v][u] = c;        }        spfa(1);    }    return 0;}




原创粉丝点击