hdu2680

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;
} 
    

 

posted @ 2015-12-31 08:47  __NaCl  阅读(83)  评论(0编辑  收藏  举报