您的位置:首页 > 其它

HDU 2544 用优先队列写的最短路径

2014-10-09 15:06 453 查看
#include <iostream>
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#define INF 0x7fffffff
using namespace std;
struct edge
{
int s,t,len;

};
vector <edge> v;
vector <int> p[110];
int dis[110];
int n,m;
void add(int s,int t,int l)
{
v.push_back((edge)
{
s,t,l
});
v.push_back((edge)
{
t,s,l
});
int number=v.size();
p[s].push_back(number-2);
p[t].push_back(number-1);
}
struct node
{
int pos;
int l;
friend bool operator <(node a,node b)
{
return a.l>b.l;
}
};
priority_queue<node> q;
bool vis[110];
void sho()
{
memset(vis,0,sizeof(vis));
dis[1]=0;
for(int i=2; i<=n; i++)
dis[i]=INF;
q.push((node)
{
1,0
});
while(!q.empty())
{
node st=q.top();
q.pop();
vis[st.pos]=1;

for(int i=0; i<(int)p[st.pos].size(); i++)
{
edge& kk=v[p[st.pos][i]];
if(!vis[kk.t] && dis[kk.t]>dis[st.pos]+kk.len)
{
dis[kk.t]=dis[st.pos]+kk.len;
q.push((node)
{
kk.t,dis[kk.t]
});
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
v.clear();
for(int i=1; i<=n; i++)
p[i].clear();
int s,t,l;
for(int i=0; i<m; i++)
{
scanf("%d%d%d
4000
",&s,&t,&l);
add(s,t,l);
}
sho();
printf("%d\n",dis
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: