• 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
    ",ans);
            else
            printf("-1
    ");    
        }
        return 0;
    } 
        
  • 相关阅读:
    可执行
    创建
    可能的加分项
    给老师的建议
    周总结
    今日总结
    今日总结
    今日总结
    今日总结
    今日总结
  • 原文地址:https://www.cnblogs.com/NaCl/p/9580139.html
Copyright © 2020-2023  润新知