zoj 1857 || poj 2607
5795 단어 ini
spfa 를 처음 사용 합 니 다. spfa 에 대해 서 는 구체 적 으로 볼 수 있 습 니 다.http://hi.baidu.com/qw4365/blog/item/115b211a8ffd14b94aedbcbf.html
/*
zoj_1857
, ~
: n , house, fire station(fs)。 fs,
house fs 。
Process:
1. floyd , 。
2. MLE, ,zoj TLE ,poj wa
3. mark ( 2), zoj TLE,poj AC(2000 ms)
4. spfa , spfa, spfa 。
poj AC, 4000 ms,zoj TLE 。。
5. spfa , spfa if( dist[i]>dist[temp]+map[temp][i] )
, if( map[temp][i]!=inf && dist[i]>dist[temp]+map[temp][i] ),
poj (1000 ms),zoj , ~
:
1.sscanf
2.spfa
3. spfa+ , 。
*/
// 1:spfa+ (1000 ms)
#include <iostream>
#include <cstdio>
#include <string.h>
#include <limits.h>
#include <queue>
#define inf 99999999
#define N 510
using namespace std;
int flag[N];
int ori[N],dist[N];
int map[N][N];
void inint()
{
int i,j;
for( i=0;i<N;i++ )
{
for( j=0;j<N;j++ )
{
if( i==j ) map[i][j]=0;
else map[i][j]=inf;
}
ori[i]=INT_MAX;
}
memset( flag,0,sizeof(flag) );
}
void spfa( int sta,int n )
{
queue <int>q;
int hash[N],temp,i;
memset( hash,0,sizeof(hash) );
for( i=0;i<=n;i++ )
dist[i]=INT_MAX;
dist[sta]=0;
q.push( sta );
hash[sta]=1;
while( !q.empty() )
{
temp=q.front(); q.pop();
hash[temp]=0;
for( i=1;i<=n;i++ )
{
if( map[temp][i]!=inf && dist[i]>dist[temp]+map[temp][i] ) // map[temp][i]!=inf,TLE
{
dist[i]=dist[temp]+map[temp][i];
if( hash[i]==0 ) hash[i]=1 , q.push(i);
}
}
}
}
int findmax( int id,int n )
{
int temp,i,maxi;
maxi=-1;
spfa( id,n );
for( i=1;i<=n;i++ )
if( !flag[i] )
{
temp=ori[i];
if( dist[i]<temp ) temp=dist[i];
if( maxi<temp ) maxi=temp;
}
return maxi;
}
int main()
{
//freopen( "AAA_a.txt","r",stdin );
int n,m,temp,i,j;
int a,b,v,mini,mark;
char str[100];
while( scanf("%d%d",&n,&m)!=EOF )
{
inint();
for( i=0;i<n;i++ )
scanf( "%d",&temp ) , flag[temp]=1 ;
getchar();
while( gets(str) && strlen(str) )
{
sscanf( str,"%d%d%d",&a,&b,&v );
map[a][b]=map[b][a]=v;
}
for( i=1;i<=m;i++ )
if( flag[i] )
{
spfa( i,m );
for( j=1;j<=m;j++ )
if( ori[j]>dist[j] )
ori[j]=dist[j];
}
mini=INT_MAX;
mark=1;
for( i=1;i<=m;i++ )
if( !flag[i] )
{
if( mini>( temp=findmax( i,m ) ) )
mini=temp , mark=i ;
}
printf( "%d
",mark );
}
return 0;
}
// 2:floyd+ (2000 ms)
//poj AC,zoj TLE
#include <iostream>
#include <cstdio>
#include <string.h>
#include <limits.h>
#define inf 99999999
#define N 510
using namespace std;
bool flag[N];
int map[N][N];
int dist[N][N][2];
int ori[N];
void inint()
{
int i,j;
for( i=0;i<N;i++ )
{
for( j=0;j<N;j++ )
{
if( i==j ) map[i][j]=0;
else map[i][j]=inf;
}
ori[i]=INT_MAX;
}
memset( flag,0,sizeof(flag) );
}
void floyd( int n )
{
int i,j,k;
for( i=0;i<=n;i++ )
for( j=0;j<=n;j++ )
dist[i][j][0]=map[i][j];
for( k=1;k<=n;k++ )
{
for( i=1;i<=n;i++ )
for( j=1;j<=n;j++ )
{
dist[i][j][1]=dist[i][j][0];
if( dist[i][j][1]>dist[i][k][0]+dist[k][j][0] )
dist[i][j][1]=dist[i][k][0]+dist[k][j][0];
}
for( i=1;i<=n;i++ )
for( j=1;j<=n;j++ )
dist[i][j][0]=dist[i][j][1];
}
}
int findmax( int id,int n )
{
int temp,i,maxi;
maxi=-1;
for( i=1;i<=n;i++ )
if( !flag[i] )
{
temp=ori[i];
if( dist[i][id][0]<temp ) temp=dist[i][id][0];
if( maxi<temp ) maxi=temp;
}
return maxi;
}
int main()
{
//freopen( "AAA_a.txt","r",stdin );
int n,m,temp,i,j;
int a,b,v,mini,mark;
char str[100];
while( scanf("%d%d",&n,&m)!=EOF )
{
inint();
for( i=0;i<n;i++ )
scanf( "%d",&temp ) , flag[temp]=1 ;
getchar();
while( gets(str) && strlen(str) )
{
sscanf( str,"%d%d%d",&a,&b,&v );
map[a][b]=map[b][a]=v;
}
floyd(m);
for( i=1;i<=m;i++ )
{
if( !flag[i] )
{
for( j=1;j<=m;j++ )
if( flag[j] && ori[i]>dist[i][j][0] )
ori[i]=dist[i][j][0];
}
else ori[i]=0;
}
mini=INT_MAX;
mark=1; // , fire station
for( i=1;i<=m;i++ )
if( !flag[i] )
{
if( mini>( temp=findmax( i,m ) ) || mini==INT_MAX )
mini=temp , mark=i ;
}
printf( "%d
",mark );
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
HDU 1017 A Mathematical Curiosity(문제 해결 보고서)바보 B원에서 전재하다 Problem Description Given two integers n and m, count the number of pairs of integers (a,b) such that 0 < a...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.