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]
原文地址:https://www.cnblogs.com/chensiang/p/4993033.html