• 1295: [SCOI2009]最长距离


    很暴力的一道题。

    建图,每个点跑一遍spfa,然后能到的点距离取Max

    一开始建图傻逼地把边建重了,又RE又WA。。。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #include<vector>
    typedef long long LL;
    const int maxn=35;
    using namespace std;
    int n,m,T,u,v,a[maxn*maxn],fir[4005],nxt[4005],to[4005],val[4005],ecnt,dis[1005],vis[1005];
    char s[maxn];
    double ans;
    void add(int x,int y) {
        nxt[++ecnt]=fir[x]; fir[x]=ecnt; to[ecnt]=y; val[ecnt]=a[y];
        nxt[++ecnt]=fir[y]; fir[y]=ecnt; to[ecnt]=x; val[ecnt]=a[x];
    }
    int ok(int x,int y) {
        v=(x-1)*m+y;
        return x>=1&&x<=n&&y>=1&&y<=m;
    }
    double cal(int x,int y,int x2,int y2) {
        return sqrt((double)(x-x2)*(x-x2)+(double)(y-y2)*(y-y2));
    }
    void spfa(int s_x,int s_y) {
        int s=(s_x-1)*m+s_y;
        queue<int>que;
        memset(dis,127/3,sizeof(dis));
        memset(vis,0,sizeof(vis));
        dis[s]=a[s]; vis[s]=1;
        que.push(s);
        while(!que.empty()) {
            int x=que.front();
            que.pop();
            vis[x]=0;
            for(int i=fir[x];i;i=nxt[i]) {
                if(dis[to[i]]>dis[x]+val[i]) {
                    dis[to[i]]=dis[x]+val[i];
                    if(!vis[to[i]]) {
                        vis[to[i]]=1;
                        que.push(to[i]);
                    }
                 }
            }
        }
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)  {
            if(dis[(i-1)*m+j]<=T)
            ans=max(ans,cal(i,j,s_x,s_y));
        }
    }
    int main()
    {
        //freopen(".in","r",stdin);
        //freopen(".out","w",stdout);
        scanf("%d%d%d",&n,&m,&T);
        for(int i=1;i<=n;i++) {
            scanf("%s",s+1);
            for(int j=1;j<=m;j++) a[(i-1)*m+j]=s[j]-'0';
        }
        for(int i=1;i<=n;i++) 
            for(int j=1;j<=m;j++) {
                u=(i-1)*m+j;
                //if(ok(i-1,j)) add(u,v);
                if(ok(i+1,j)) add(u,v);
                if(ok(i,j+1)) add(u,v);
                //if(ok(i,j-1)) add(u,v);
            }
        for(int i=1;i<=n;i++) 
            for(int j=1;j<=m;j++) 
                spfa(i,j);
        printf("%.6lf
    ",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    speeding up your web site 前端性能优化
    数据结构与算法学习链表
    SQL Server 无法生成 FRunCM 线程
    NoSql的优缺点
    Vs2012中开发Node.js应用
    利用GNUstep在windows下编写objectc
    Hadoop HDFS学习总结
    HBase Thrift 接口的一些使用问题及相关注意事项
    .NET深入解析LINQ框架
    【翻译】ASP.NET Web API是什么?
  • 原文地址:https://www.cnblogs.com/Achenchen/p/7520147.html
Copyright © 2020-2023  润新知