poj1125

不得不说,这道提让我懂了很多,第一次知道memset初始化是按字节初始化的

这道题用自己的方法A了以后,发现discuss里面都说用floyd,然后决定用floyd A一次

应该是数据太水了 两个都是0Ms  400k左右

两个程序不同之处也就是找最短路径时不一样

一个floyd的教程:http://www.cnblogs.com/twjcnblog/archive/2011/09/07/2170306.html

我自己想的方法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int dp[150][150],loc[150][150],used[150],out[150];
void dp1(int i,int n,int value,int st)//第i个到n-1个点最短距离,
{
int i1,temp,i2,tval;


for(i1=0;i1<n;i1++)
{
if(loc[i][i1]!=-1&&used[i1]==0)
{

if(out[i1]!=1)
{
used[i1]=1;
temp=loc[i][i1]+value;
if(temp<dp[st][i1])
{
dp[st][i1]=temp;
}
dp1(i1,n,dp[st][i1],st);
used[i1]=0;
}
else
{
temp=loc[i][i1]+value;
if(temp<dp[st][i1])
{
dp[st][i1]=temp;
}
for(i2=0;i2<n;i2++)
{
if(dp[i1][i2]<10000&&i2!=st)//
{
temp=dp[st][i1]+dp[i1][i2];
if(temp<dp[st][i2])
{

dp[st][i2]=temp;
}
}
}
}



}
}




for(i2=0;i2<n;i2++)
{
if(dp[i][i2]<10000)//&&i2!=st
{
temp=value+dp[i][i2];
if(temp<dp[st][i2])
{

dp[st][i2]=temp;
}
}
}


}
int main(int argc, char** argv) {
int n,num,a,b,i,i1,max,min,flag,f;
while(scanf("%d",&n)&&n!=0)
{
flag=-1;
memset(out,0,sizeof(out));
for(i=0;i<n;i++)
{
for(i1=0;i1<n;i1++)
{
loc[i][i1]=-1;
}
}
for(i=0;i<n;i++)
{
for(i1=0;i1<n;i1++)
{
dp[i][i1]=10005;
}
}
for(i=0;i<n;i++)
{
used[i]=0;
}

for(i=0;i<n;i++)
{
scanf("%d",&num);
for(i1=0;i1<num;i1++)
{
scanf("%d %d",&a,&b);
loc[i][a-1]=b;
}
}

for(i=0;i<n;i++)
{
used[i]=1;
dp1(i,n,0,i);
used[i]=0;
out[i]=1;
}
min=10009;

for(i=0;i<n;i++)
{
max=0;
f=0;
for(i1=0;i1<n;i1++)
{
if(dp[i][i1]<10001)
{
++f;
if(dp[i][i1]>max)
{
max=dp[i][i1];
}

}
}
if(min>max&&f==n-1)
{
min=max;
flag=i;
}

}
if(flag==-1)
{
printf("disjoint\n");
}
else
{
printf("%d %d\n",flag+1,min);
}
for(i=0;i<n;i++)
{
printf("\n");
for(i1=0;i1<n;i1++)
{
printf("%d ",dp[i][i1]);
}
}



}
return (EXIT_SUCCESS);
}

Floyd:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char** argv) {

int n,num,a,b,i,j,k,i1,i2,max,min,flag,f;
int loc[101][101];
while(scanf("%d",&n)&&n!=0)
{
memset(loc,-1,sizeof(loc));
for(i=0;i<n;++i)
{
scanf("%d",&num);
for(i1=0;i1<num;++i1)
{
scanf("%d %d",&a,&b);
loc[i][a-1]=b;


}
}
for(k=0;k<n;++k)
for(i=0;i<n;++i)
for(j=0;j<n;++j)
{
if(loc[i][k]!=-1&&loc[k][j]!=-1&&k!=i&&k!=j&&i!=j)
{
if(loc[i][j]==-1||loc[i][j]>loc[i][k]+loc[k][j])
{
loc[i][j]=loc[i][k]+loc[k][j];
}
}
}


flag=-1;
min=10001;
for(i=0;i<n;++i)
{
max=-1;

f=0;
for(j=0;j<n;++j)
{
if(loc[i][j]!=-1)
{
++f;
if(max<loc[i][j])
{
max=loc[i][j];

}
}
}
if(f==n-1&&min>max)
{
min=max;
flag=i;
}

}
if(flag==-1)
{
printf("disjoint\n");
}
else
{
printf("%d %d\n",flag+1,min);
}
/*for(i=0;i<n;++i)
{
printf("\n");
for(j=0;j<n;j++)
{
printf("%d ",loc[i][j]);
}
}
*/
}
return (EXIT_SUCCESS);
}




原文地址:https://www.cnblogs.com/fengyuehan/p/poj1125.html