您的位置:首页 > 其它

HDU 2544 最短路(dijkstra)

2015-08-19 19:53 375 查看
题目大意:

中文题。

解题思路:

这个数据量似乎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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: