CSUOJ 1219: 建食堂

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1219

这道题先用floyd算法求出所有点之间的距离,然后枚举判断每个点到其他点的最大距离,找出其中最小的

一个,如果发现其中有一个点不可到其他点,则输出Can not。

 

#include<stdio.h>
#include<stdlib.h>
#define MAXD 105
#define INF 1000007

int d[MAXD][MAXD];
int n, m, u, v, w, max, mini;
bool flag;

int min( int a, int b)
{
return a < b ? a : b;
}

void init()
{
for( int i = 0; i < n; i ++)
for( int j = 0; j < n; j ++)
{
if( i == j) d[i][j] = 0;
else
d[i][j] = INF;
}
while( m --)
{
scanf( "%d%d%d", &u, &v, &w);
d[u][v] = d[v][u] = w;
}
}

void floyd()
{
for( int k = 0; k < n; k ++)
for( int i = 0; i < n; i ++)
for( int j = 0; j < n; j ++)
d[i][j] = min( d[i][j], d[i][k] + d[k][j]);
mini = INF * 10;
for( int i = 0; i < n; i ++)
{
max = 0;
flag = true;
for( int j = 0; j < n; j ++)
{
if( max < d[i][j]) max = d[i][j];
if( max == INF) {
flag = false;
break;
}
}
if( !flag) break;
if( max < mini) mini = max;
}
}

int main()
{
while( scanf( "%d%d", &n, &m) == 2)
{
init();
floyd();
if( flag) printf( "%d\n", mini);
else
printf( "Can not\n");
}
return 0;
}

下面是swm0823的代码:

 

#include<cstdio>
#define INF 99999999
using namespace std;
int m,n,map[105][105];
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
map[i][j]=INF;
}
}

int a,b,c;
for(int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]>c)map[a][b]=map[b][a]=c;
}

for(int k=0;k<n;k++){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(map[i][j]>map[i][k]+map[k][j]){
map[i][j]=map[i][k]+map[k][j];
}
}
}
}

int minl=INF,maxl;
for(int i=0;i<n;i++){
maxl=0;
for(int j=0;j<n;j++){
if(map[i][j]>maxl)maxl=map[i][j];
}
if(maxl<minl)minl=maxl;
}
if(minl==INF){
printf("Can not\n");
}else{
printf("%d\n",minl);
}
}
return 0;
}



你可能感兴趣的:(OJ)