HDU2544 最短路(模版题dijkstra/floyd/spfa)

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& lt;=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
Sample Output
3 2
dijkstra:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
#define inf 0x3f3f3f3f
#define maxn 1e5+7 struct node
{
    int v,d;
    node(int a=0,int b=0):v(a),d(b){}
    bool operator < (const node &a) const
    {
        return d>a.d;
    }
};
struct edge
{
    int v,cost;
    edge(int a=0,int b=0):v(a),cost(b){}
};
vector<edge> eg[maxn];
bool vis[maxn];
int n,m,dis[maxn];
void dijkstra(int x)
{
    memset(vis,false,sizeof(vis));
    for(int i=0; i<=n; i++)
        dis[i]=inf;
    priority_queue<node>q;
    while(!q.empty()) q.pop();
    dis[x]=0;
    q.push(node(x,0));
    node tmp;
    while(!q.empty())
    {
        tmp=q.top();
        q.pop();
        int u=tmp.v;
        if(vis[u]) continue;
        //if(u==n) return ;
        vis[u]=true;
        for(int i=0; i<eg[u].size(); i++)
        {
            int v=eg[tmp.v][i].v;
            int cost=eg[u][i].cost;
            if(!vis[v]&&dis[v]>dis[u]+cost)
            {
                dis[v]=dis[u]+cost;
                q.push(node(v,dis[v]));
            }
        }
    }
}
int main() { //freopen("in.txt","r",stdin); while(~scanf("%d%d",&n,&m)&&n) { for(int i=1;i<=n;i++) eg[i].clear(); while(m--) { scanf("%d%d%d",&a,&b,&t); eg[a].push_back(edge(b,t)); eg[b].push_back(edge(a,t)); } dijkstra(1); printf("%d\n",dis[n]); } return 0; }

 floyd:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
#define inf 1e8
int dis[105][105];
int main()
{
    //freopen("in.txt","r",stdin);
    int n,m,a,b,t;
    while(~scanf("%d%d",&n,&m)&&n)
    {
        for(int i=1;i<=n;i++)
        {
            dis[i][i]=0;
            for(int j=1;j<i;j++)
                dis[i][j]=dis[j][i]=inf;
        }
        while(m--)
        {
            scanf("%d%d%d",&a,&b,&t);
            dis[a][b]=dis[b][a]=t;
        }
        for(int k=1;k<=n;k++)
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
        printf("%d\n",dis[1][n]);
    }
    return 0;
}

 spfa:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
#define inf 1e8
struct node
{
    int x,s;
    node(int a,int b){x=a;s=b;}
};
vector<node>eg[105];
int n,m,a,b,s,dis[105];
bool vis[105];
void spfa(int x)
{
    memset(vis,false,sizeof(vis));
    for(int i=1;i<=n;i++)
        dis[i]=inf;
    dis[x]=0;
    vis[x]=true;
    queue<int>q;
    q.push(x);
    while(!q.empty())
    {
        int y=q.front();
        q.pop();
        vis[y]=false;
        for(int i=0;i<eg[y].size();i++)
        {
            int p=eg[y][i].x,s=eg[y][i].s;
            if(dis[p]>dis[y]+s)
            {
                dis[p]=dis[y]+s;
                if(vis[p]==false)
                {
                    vis[p]=true;
                    q.push(p);
                }
            }
        }
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(~scanf("%d%d",&n,&m)&&n)
    {
        for(int i=1;i<=n;i++)
            eg[i].clear();
        while(m--)
        {
            scanf("%d%d%d",&a,&b,&s);
            eg[a].push_back(node(b,s));
            eg[b].push_back(node(a,s));
        }
        spfa(1);
        printf("%d\n",dis[n]);
    }
    return 0;
}

 

posted on 2015-08-24 11:18  恶devil魔  阅读(207)  评论(0编辑  收藏  举报

导航