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\n",ans);
83     return 0;
84 }

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

Day2

[Submit][Status][Discuss]

时间: 2024-10-14 21:01:25

bzoj1295的相关文章

bzoj1295 最长距离

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.

BZOJ1295: [SCOI2009]最长距离

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1295 转成最短路. #include<cstring> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstdio> #include<cmath> #include<queue> #define rep(i,l,r) for (in

bzoj1295:[SCOI2009]最长距离

题目描述 windy有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有的格子含有障碍物. 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离. 如果从格子A不可以走到格子B,就没有距离. 如果格子X和格子Y有公共边,并且X和Y均不含有障碍物,就可以从X走到Y. 如果windy可以移走T块障碍物,求所有格子间的最大距离. 保证移走T块障碍物以后,至少有一个格子不含有障碍物. 输入 输入文件maxlength.in第一行包含三个整数,N M T. 接下来有N行,每行

[SCOI2009][BZOJ1295] 最长距离

1295: [SCOI2009]最长距离 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1018  Solved: 538[Submit][Status][Discuss] Description windy有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有的格子含有障碍物. 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离. 如果从格子A不可以走到格子B,就没有距离. 如果格子X和格子Y有公共边,并且X和Y均

【spfa】bzoj1295 [SCOI2009]最长距离

题意:给你一个n*m的点阵.有些点是障碍,求一个欧几里得距离最大的点对(A,B),使得在移走的障碍≤T的情况下,可以从A走到B. 建图,跑n*m次spfa,求出从 每个点 出发到 其他所有点 的 经过的障碍数.若这个值<=T,则可以用来更新答案. 1 #include<cstdio> 2 #include<queue> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

20160529~20160604 13

蒟蒻Yzm 20160530 bzoj2333 http://www.lydsy.com/JudgeOnline/problem.php?id=2333 题意: 有N个节点,M个操作:连接两个节点.单个节点的权值增加v.节点所在的连通块的所有节点的权值增加v.所有节点的权值增加v.询问节点当前的权值.询问节点所在的连通块中权值最大的节点的权值.询问所有节点中权值最大的节点的权值. N,M≤300000 代码: 1 #include <cstdio> 2 #include <cstring

[转载]hzwer的bzoj题单

counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ1202 BZOJ1051 BZOJ1001 BZOJ1588 BZOJ1208 BZOJ1491 BZOJ1084 BZOJ1295 BZOJ3109 BZOJ1085 BZOJ1041 BZOJ1087 BZOJ3038 BZOJ1821 BZOJ1076 BZOJ2321 BZOJ1934 BZOJ