• bzoj1295


    加边时把障碍点当作点权为1的边 暴力枚举 在距离<=t的点中统计答案即可(注意初值)

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<ctime>
     5 #include<cmath>
     6 #include<iostream>
     7 #include<algorithm>
     8 #include<queue>
     9 #include<stack>
    10 #include<set>
    11 #define clr(a,x) memset(a,x,sizeof(a))
    12 #define rep(i,l,r) for(int i=(l);i<(r);i++)
    13 using namespace std;
    14 typedef long long ll;
    15 typedef pair<int,int> pii;
    16 #define mkp(a,b) make_pair(a,b)
    17 int read(){
    18     int ans=0,f=1;
    19     char c=getchar();
    20     while(!isdigit(c)){
    21         if(c=='-') f=-1;
    22         c=getchar();
    23     }
    24     while(isdigit(c)){
    25         ans=ans*10+c-'0';
    26         c=getchar();
    27     }
    28     return ans*f;
    29 }
    30 const int maxn=40,inf=0x3fffffff;
    31 int t,n,m,a[maxn][maxn],d[maxn*maxn];
    32 double ans;
    33 int cnt(int x,int y){
    34     return (x-1)*m+y;
    35 }
    36 double dis(int x1,int y1,int x2,int y2){
    37     return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
    38 }
    39 struct edge{
    40     int v,w;
    41     edge*next;
    42 }e[maxn*maxn*maxn],*fir[maxn*maxn],*pt=e;
    43 void addedge(int u,int v,int w){
    44     pt->v=v;pt->w=w;
    45     pt->next=fir[u];
    46     fir[u]=pt++;
    47 }
    48 void cal(int x,int y){
    49     rep(i,1,cnt(n,m)+1) d[i]=inf;d[cnt(x,y)]=a[x][y];
    50     priority_queue<pii,vector<pii>,greater<pii> >Q;
    51     Q.push(mkp(0,cnt(x,y)));
    52     while(!Q.empty()){
    53         int Dis=Q.top().first,x=Q.top().second;Q.pop();
    54         if(Dis!=d[x]) continue;
    55         for(edge*e=fir[x];e;e=e->next){
    56             if(d[e->v]>d[x]+e->w){
    57                 d[e->v]=d[x]+e->w;
    58                 Q.push(mkp(d[e->v],e->v));
    59             }
    60         }
    61     }
    62     rep(i,1,n+1)
    63         rep(j,1,m+1) if(d[cnt(i,j)]<=t) ans=max(ans,dis(i,j,x,y));
    64 }
    65 int main(){
    66     n=read();m=read();t=read();
    67     rep(i,1,n+1)
    68         rep(j,1,m+1){
    69             char c=getchar();
    70             while(c!='0'&&c!='1') c=getchar();
    71             a[i][j]=c-'0';
    72         }
    73     rep(i,1,n+1)
    74         rep(j,1,m+1){
    75             if(i-1>0) addedge(cnt(i-1,j),cnt(i,j),a[i][j]);
    76             if(i+1<=n) addedge(cnt(i+1,j),cnt(i,j),a[i][j]);
    77             if(j-1>0) addedge(cnt(i,j-1),cnt(i,j),a[i][j]);
    78             if(j+1<=m) addedge(cnt(i,j+1),cnt(i,j),a[i][j]);
    79         }
    80     rep(i,1,n+1)
    81         rep(j,1,m+1) cal(i,j);
    82     printf("%.6lf
    ",ans);
    83     return 0;
    84 }
    View Code

    1295: [SCOI2009]最长距离

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 1108  Solved: 593
    [Submit][Status][Discuss]

    Description

    windy有一块矩形土地,被分为 N*M 块 1*1 的小格子。 有的格子含有障碍物。 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离。 如果从格子A不可以走到格子B,就没有距离。 如果格子X和格子Y有公共边,并且X和Y均不含有障碍物,就可以从X走到Y。 如果windy可以移走T块障碍物,求所有格子间的最大距离。 保证移走T块障碍物以后,至少有一个格子不含有障碍物。

    Input

    输入文件maxlength.in第一行包含三个整数,N M T。 接下来有N行,每行一个长度为M的字符串,'0'表示空格子,'1'表示该格子含有障碍物。

    Output

    输出文件maxlength.out包含一个浮点数,保留6位小数。

    Sample Input

    【输入样例一】
    3 3 0
    001
    001
    110


    【输入样例二】
    4 3 0
    001
    001
    011
    000


    【输入样例三】
    3 3 1
    001
    001
    001

    Sample Output

    【输出样例一】
    1.414214

    【输出样例二】
    3.605551

    【输出样例三】
    2.828427

    HINT

    20%的数据,满足 1 <= N,M <= 30 ; 0 <= T <= 0 。
    40%的数据,满足 1 <= N,M <= 30 ; 0 <= T <= 2 。
    100%的数据,满足 1 <= N,M <= 30 ; 0 <= T <= 30 。

    Source

    [Submit][Status][Discuss]
  • 相关阅读:
    List循环删除不干净
    实验二白盒测试
    ArcGIS 计算面积
    ArcGIS 矢量叠加分析 面与面叠加 分析叠加面的属性特征
    Primitive篇(贴图)
    Cesium的tooltip(推荐)
    ArcGIS(批量)删除属性字段
    shp文件转kml方式
    Cesium绘制虚线 primitive entity
    cesium之流动线
  • 原文地址:https://www.cnblogs.com/chensiang/p/4993033.html
Copyright © 2020-2023  润新知