zoukankan      html  css  js  c++  java
  • PAT L3-005. 垃圾箱分布

    最短路。

    枚举垃圾箱放哪里,然后算最短路。

    #include<map>
    #include<set>
    #include<ctime>
    #include<cmath>
    #include<queue>
    #include<string>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<functional>
    using namespace std;
    
    int n,m,k,ds;
    char u[10];
    vector<int>g[2000];
    
    int v[1100][1100];
    int dis[1100], f[1100];
    int fail=1;
    
    int ansLen=-1,avg=-1,id=-1;
    
    int get()
    {
        int sum=0;
        if(u[0]!='G')
        {
            for(int i=0;u[i];i++) sum=sum*10+u[i]-'0';
        }
        else
        {
            for(int i=1;u[i];i++) sum=sum*10+u[i]-'0';
            sum = sum + n;
        }
        return sum;
    }
    
    void spfa(int x)
    {
        for(int i=1;i<=n+m;i++) dis[i] = 0x7FFFFFFF;
        queue<int>Q; memset(f,0,sizeof f);
        dis[x]=0; f[x]=1; Q.push(x);
    
        while(!Q.empty())
        {
            int h= Q.front(); Q.pop(); f[h]=0;
    
            for(int i=0;i<g[h].size();i++)
            {
                int to = g[h][i];
                if(dis[h]+v[h][to]<dis[to])
                {
                    dis[to] = dis[h]+v[h][to];
                    if(f[to]==0)
                    {
                        f[to]=1;
                        Q.push(to);
                    }
                }
            }
        }
    
        for(int i=1;i<=n;i++) if(dis[i]>ds) return ;
    
        fail=0;
    
        int mi=0x7FFFFFFF,sum=0;
        for(int i=1;i<=n;i++) sum=sum+dis[i],mi = min(mi,dis[i]);
    
        if(id==-1)
        {
            id = x;
            ansLen = mi;
            avg = sum;
        }
    
        else
        {
            if(mi>ansLen)
            {
                id = x;
                ansLen = mi;
                avg = sum;
            }
            else if(mi==ansLen)
            {
                if(sum<avg)
                {
                    id = x;
                    ansLen = mi;
                    avg = sum;
                }
            }
        }
    }
    
    int main()
    {
        scanf("%d%d%d%d",&n,&m,&k,&ds);
        for(int i=1;i<=k;i++)
        {
            int c;
            scanf("%s",u); int A = get();
            scanf("%s",u); int B = get();
            scanf("%d",&c);
    
            v[A][B]=v[B][A]=c;
            g[A].push_back(B); g[B].push_back(A);
        }
    
        for(int i=n+1;i<=n+m;i++)
        {
            spfa(i);
        }
    
        if(fail) printf("No Solution
    ");
        else
        {
            printf("G%d
    ",id-n);
            printf("%.1f %.1f
    ",1.0*ansLen,1.0*avg/n);
        }
    
        return 0;
    }
  • 相关阅读:
    web中间件之nginx
    JVM之工具分析
    jprofiler监控tomcat
    如何查看端口被占用
    训练赛第二场C题 zoj 2339 Hyperhuffman
    训练赛第三场A题 zoj 559
    训练赛第二场G题 ZOJ 2343
    训练赛第一场D题
    训练赛第一场A题 (ZOJ 2313)
    HDU 1422 重温世界杯 DP题
  • 原文地址:https://www.cnblogs.com/zufezzt/p/6600460.html
Copyright © 2011-2022 走看看