[플로이드 분치] 마늘의 길 2016 재경기.바이두 지도의 실시간 도로 상황
만약 l=r, n2가 디스 수조를 한 번 훑어보고 답을 기록한다면 [l,r] 구간으로 처리한다.
그렇지 않으면 [l,mid]의 가장자리를 그림에 넣고 [mid+1,r]로 돌아가고 [mid+1,r]의 가장자리를 그림에 넣고 [l,mid]로 돌아간다
#include
#include
#include
#include
using namespace std;
const int N=310,inf=1<<29;
typedef long long ll;
int n;
int dis[N][N];
ll ans;
void solve(int l,int r){
if(l==r){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j && i!=l && j!=l) ans+=dis[i][j]==inf?-1:dis[i][j];
return ;
}
int mid=l+r>>1,tmp[N][N];
memcpy(tmp,dis,sizeof(tmp));
for(int k=l;k<=mid;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
solve(mid+1,r);
memcpy(dis,tmp,sizeof(dis));
for(int k=mid+1;k<=r;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
solve(l,mid);
memcpy(dis,tmp,sizeof(dis));
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
scanf("%d",&dis[i][j]);
if(!~dis[i][j]) dis[i][j]=inf;
}
solve(1,n);
cout<return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Uva10986-Sending email텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.