您的位置:首页 > 其它

一个人的旅行 HDU - 2066

2017-08-23 20:10 323 查看
最短路模板题

仅仅将草儿的位置定为0,即可

以下为我用链式前向星写的最短路

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=500005;
const int inf=0x3f3f3f3f;
int vis[maxn],head[maxn],dis[maxn];
int cnt=0;
struct edge
{
int next,v,w;
}edge[maxn*4];
struct node
{
int distance,point;
node(){}
node(int _point,int _distance)
{
distance=_distance;
point=_point;
}
friend bool operator <(node aa,node bb)
{
return aa.distance>bb.distance;
}
};
void add_edge(int u,int v,int w)
{
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void zyz(int s)
{
int i;
for(i=0;i<=1010;i++)
dis[i]=inf;
dis[s]=0;
priority_queue<node> q;
memset(vis,0,sizeof(vis));
q.push(node(s,dis[s]));
while(!q.empty())
{
node now;
now=q.top();
q.pop();
if(vis[now.point])
continue;
vis[now.point]=1;
for(i=head[now.point];i!=-1;i=edge[i].next)
{
int to=edge[i].v;
if(dis[to]>dis[now.point]+edge[i].w)
{
dis[to]=dis[now.point]+edge[i].w;
q.push(node(to,dis[to]));
//cout<<to<<"  "<<dis[to]<<endl;
}
}

}
}
int main ()
{
int s,t,d;
while(~scanf("%d%d%d",&t,&s,&d))
{
cnt=0;
memset(head,-1,sizeof(head));
int i;
for(i=1;i<=t;i++)
{
int xx,yy,zz;
scanf("%d%d%d",&xx,&yy,&zz);
add_edge(xx,yy,zz);
add_edge(yy,xx,zz);
}
for(i=1;i<=s;i++)
{
int xx;
scanf("%d",&xx);
add_edge(xx,0,0);
add_edge(0,xx,0);
}
zyz(0);
int minn=inf;
for(i=1;i<=d;i++)
{
int xx;
scanf("%d",&xx);
//  cout<<dis[xx]<<endl;
minn=min(minn,dis[xx]);
}
printf("%d\n",minn);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: