您的位置:首页 > 其它

HDU 1874 畅通工程续

2012-08-27 23:00 211 查看
无向图最短路,邻接表+优先队列

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<vector>
#include<queue>

const int maxn = 210;
const int maxm = 1010;
const int inf = 0xfffffff;

int v[maxm*2],u[maxm*2],w[maxm*2],d[maxn],next[maxm*2],first[maxn];

using namespace std;

typedef pair<int,int> pii;

bool vis[maxn];

int main()
{
int n,m,s,t,i;
while(scanf("%d%d",&n,&m)!=EOF){
int M=2*m;
memset(first,-1,sizeof(first));
for(i=0;i<M;i+=2){
scanf("%d%d%d",&u[i],&v[i],&w[i]);
next[i]=first[u[i]];
first[u[i]]=i;
u[i+1]=v[i],v[i+1]=u[i];
next[i+1]=first[u[i+1]];
first[u[i+1]]=i+1;
w[i+1]=w[i];
}
scanf("%d%d",&s,&t);
for(i=0;i<n;i++)
d[i]=inf;
d[s]=0;
memset(vis,false,sizeof(vis));
priority_queue<pii,vector<pii>,greater<pii> > q;
q.push(make_pair(d[s],s));
while(!q.empty()){
pii u=q.top();
q.pop();
int x=u.second;
if(vis[x])
continue;
vis[x]=true;
for(i=first[x];i!=-1;i=next[i])
if(d[v[i]]>d[x]+w[i]){
d[v[i]]=d[x]+w[i];
q.push(make_pair(d[v[i]],v[i]));
}
}
if(d[t]==inf)
printf("-1\n");
else
printf("%d\n",d[t]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: