加边时把障碍点当作点权为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 }
1295: [SCOI2009]最长距离
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 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
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
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 。