zoukankan      html  css  js  c++  java
  • 最短路之SPFA(单源)HDU 2066

    #include "iostream"
    #include "cstdio"
    #include "queue"
    #include <cstring>
    #include <string>
    #include "algorithm"
    using namespace std;
    #define Maxn 1005
    #define inf 1<<29
    int Map[Maxn][Maxn];
    int vis[Maxn];
    int dict[Maxn];
    bool inq[Maxn];
    int s[Maxn];
    int e[Maxn];
    int n;
    void Init()
    {
        for(int i=0;i<=Maxn;i++)
        {
            for(int j=0;j<=Maxn;j++)
            {
                if(i==j)
                    Map[i][j]=0;
                else
                    Map[i][j]=Map[j][i]=inf;
            }
        }
    }
    void build_map(int T)
    {
        for(int i=0;i<T;i++)
        {
            int a,b,time;
            scanf("%d%d%d",&a,&b,&time);
            n = max(max(n,a),b);
            if(time<Map[a][b])
            Map[a][b]=Map[b][a]=time;
        }
       // cout<<n<<endl;
    }
    void spfa(int x,int n)
    {
        queue <int> Q;
        memset(vis, 0, sizeof(vis));
        memset(inq, false, sizeof(inq));
        for(int i=0;i<=n;i++)
            dict[i]=inf;
        dict[x]=0;
        inq[x]=true;
        Q.push(x);
        while (!Q.empty())
        {
            int q=Q.front();
            Q.pop();
            //if(inq[q]==true)
                inq[q]=false;
            for(int i=0;i<=n;i++)
            {
                if(Map[q][i]<inf && dict[q]+Map[q][i]<dict[i])
                {
                    dict[i]=dict[q]+Map[q][i];
                    if(inq[i]==false)
                    {
                        Q.push(i);
                        inq[i]=true;
                    }
                }
            }
        }
    }
    int main()
    {
        int T,S,D;
        while(~scanf("%d%d%d",&T,&S,&D))
        {
            n=0;
            Init();
            build_map(T);
            int minn=inf;
            for(int i=0;i<S;i++)
            {
                scanf("%d",&s[i]);
                Map[0][s[i]]=Map[s[i]][0]=0;
            }
            
            int temp=0;
            
            for(int i=0;i<D;i++)
            {
                scanf("%d",&e[i]);
            }
            spfa(temp,n);
            
            /*for(int i=0;i<n;i++)
                cout<<dict[i]<<" ";
            */
                for(int i=0;i<D;i++)
                    minn=min(minn,dict[e[i]]);
            printf("%d
    ",minn);
            
        }
        return 0;
    }
  • 相关阅读:
    使用respondsToSelector:来发现对象是否响应消息
    使用iskindofclass来发现对象是否是某类或其子类的实例
    集合set的使用
    字典的使用
    数组的使用
    对NSNumber的理解
    数组、字典和集合的定义
    强引用strong和弱引用weak的定义
    类工厂方法的定义
    POJ 2262 / UVa 543
  • 原文地址:https://www.cnblogs.com/xiao-xue-di/p/9446755.html
Copyright © 2011-2022 走看看