HDU 2544 最短路(dijkstra)

题目大意:

中文题。


解题思路:

这个数据量似乎floyd都能过……我写了个用set优化的dijkstra。


#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<set>
#define LL long long
#define db double
#define maxn 10000000
#define EPS 1e-15
#define max(a,b) ((a>b)?(a):(b))
#define min(a,b) ((a<b)?(a):(b))
using namespace std;

int m,q,i,n,j;
int g[1086][1086],dis[1086];
bool vis[1086];
struct cmp{
    bool operator()(const int & a,const int & b){
        return dis[a]<dis[b] || dis[a]==dis[b] && a<b;
    }
};
set<int ,cmp> S;
int dij(int s,int t){
    memset(vis,0,sizeof(vis));
    memset(dis,0x7f,sizeof(dis));
    S.clear();
    S.insert(s);
    dis[s]=0;
    while (!S.empty()){
        i=*S.begin();
        S.erase(i);
        if (i==t) return dis[t];
        vis[i]=true;
        for(j=1;j<=n;++j){
            if(!vis[j] && g[i][j]){
                if (dis[j]>dis[i]+g[i][j]){
                    S.erase(j);
                    dis[j]=dis[i]+g[i][j];
                    S.insert(j);
                }
            }
        }
    }
    return -1;
}
int main(){
    while(1){
        int a,b,c;
        memset(g,0x1f,sizeof(g));
        scanf("%d%d",&n,&m);
        if (n==0 && m==0) break;
        for (int i=1;i<=m;i++){
            scanf("%d%d%d",&a,&b,&c);
            g[a][b]=c; g[b][a]=c;
        }
        printf("%d\n",dij(1,n));
    }
    return 0;
}


你可能感兴趣的:(HDU 2544 最短路(dijkstra))