您的位置:首页 > 其它

hdu2680

2015-12-31 08:47 190 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2680
题意就是给你n个起点,一个重点,问从起点到终点最小的花费是多少= =

首先这题是有向图,然后我们把起点看成是终点,终点看成起点。然后用迪杰斯特拉算法求最短路。然后因为我们把终点和起点换了,所以我们建图的时候本来是x->y,要写成y->x

#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=2*50000;
#define inf 99999999
struct node
{
int v;
int w;
int next;
}V[maxn];
int head[maxn];
int d[maxn];
int n;
int tol;
int done[maxn];
typedef pair<int,int>pii;
priority_queue<pii,vector<pii>,greater<pii> >q;
void init()
{
tol=0;
memset(head,-1,sizeof(head));
}
void dijk(int s)
{
while(!q.empty())
q.pop();
memset(done,0,sizeof(done));
for(int i=1;i<=n;i++)
d[i]=inf;
d[s]=0;
q.push(make_pair(d[s],s));
while(!q.empty())
{
pii  u=q.top();
q.pop();
int x=u.second;
if(done[x])
continue;
done[x]=1;
for(int e=head[x];e!=-1;e=V[e].next)
{
int v=V[e].v;
int w=V[e].w;
if(d[x]+w<d[v])
{
d[v]=d[x]+w;
q.push(make_pair(d[v],v));
}
}
}
}
void add(int u,int v,int w)
{
V[tol].v=v;
V[tol].w=w;
V[tol].next=head[u];
head[u]=tol++;
}
int main()
{
int m,s;
while(scanf("%d %d %d",&n,&m,&s)!=EOF)
{
init();
int x,y,z;
while(m--)
{
scanf("%d %d %d",&x,&y,&z);
add(y,x,z);
}
dijk(s);
int num,ans=inf;
bool flag=0;
scanf("%d",&num);
int id;
while(num--)
{
scanf("%d",&id);
if(d[id]<ans)
{
flag=1;
ans=d[id];
}
}
if(flag)
printf("%d\n",ans);
else
printf("-1\n");
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: