10987 - Antifloyd
Posted: Sat Feb 04, 2006 2:29 pm
Can this problem be solved using MST?
Code: Select all
#include<iostream>
#include<algorithm>
using namespace std;
long n,e,m[200][200],sum;
bool antifloyed(){
int i,j,k;
for(k=1;k<=n;k++){
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(k==i||k==j||i==j)continue;
if(m[i][k]+m[k][j]<m[i][j])return true;
}
}
}
return false;
}
int main(){
long t,x=0,i,j;
//freopen("1.txt","r",stdin);
cin>>t;
while(t--){
cout<<"Case #"<<++x<<":\n";
cin>>n;
fill(m[0],m[n+1],0);
for(i=2;i<=n;i++){
for(j=1;j<i;j++){
cin>>m[i][j];
m[j][i]=m[i][j];
}
}
if(antifloyed()){cout<<"Need better measurements.\n\n";continue;}
cout<<n-1<<endl;
for(i=1;i<n;i++)cout<<i<<" "<<i+1<<" "<<m[i][i+1]<<endl;
cout<<endl;
}
return 0;
}
Code: Select all
#include<stdio.h>
#include<stdlib.h>
int node,rank[1001],parent[1001],i,j,k,u,v,pos[1002][3],edge,test,mat[102][102],kase;
bool flg;
typedef struct{
int x,y,z;
}Ind;
Ind ar[10011],ans[10011];
int cmp(const void *a,const void *b)
{
Ind *X = (Ind *) a;
Ind *Y = (Ind *) b;
if(X->y == Y->y)return X->z - Y->z;
return X->y - Y->y;
}
int cmp1(const void *a,const void *b)
{
Ind *X = (Ind *) a;
Ind *Y = (Ind *) b;
return X->x - Y->x;
}
int Find_Set(int x)
{
if(x != parent[x] )
parent[x]=Find_Set(parent[x]);
return parent[x];
}
void Link(int x,int y)
{
if(rank[x]>rank[y])
parent[y]=x;
else
{
parent[x]=y;
if(rank[x]==rank[y])
rank[y]=rank[y]+1;
}
}
int main()
{
scanf("%d",&test);
while(test--)
{
scanf("%d",&node);
k=0;
for(i=0;i<node;i++) parent[i] = i,rank[i] = 0;
for(i=1;i<node;i++)
{
for(j=0;j<i;j++)
{
scanf("%d",&u);
ar[k].x = u ;
ar[k].y = j ;
ar[k++].z = i ;
mat[j][i] = mat[i][j] = u;
}
mat[i][i]=0;
}
edge = k;
flg = 0;
for(k=0;k<node && !flg;k++)
for(i=0;i<node && !flg;i++)
for(j=0;j<node;j++)
if(mat[i][j] > mat[i][k]+mat[k][j])
{
flg = 1;
break;
}
printf("Case #%d:\n",++kase);
if(!flg)
{
qsort(ar,edge,sizeof(Ind),cmp1);
/* for(i=0;i<edge;i++)
printf("%d %d %d\n",ar[i].x,ar[i].y+1,ar[i].z+1);*/
k=0;
for( i=0 ; i<edge ; i++ )
{
u=Find_Set(ar[i].y);
v=Find_Set(ar[i].z);
if(u!=v)
{
Link(u,v);
ans[k].x = ar[i].y;
ans[k].y = ar[i].z;
ans[k++].z = ar[i].x;
}
}
qsort(ans,k,sizeof(Ind),cmp);
if(k!=node-1)
{
flg = 1;break;
}
for(i=0;i<k;i++)
printf("%d %d %d\n",ans[i].x+1,ans[i].y+1,ans[i].z);
}
if(flg) printf("Need better measurements.\n");
printf("\n");
}
return 0;
}