level 1
游隼烈天
楼主
一道简单的最短路径问题,可就是一直WA,题目是
http://210.32.0.220/onlinejudge/showProblem.do?problemId=82
下面是我写的一段程序
结果与例题的结果一样,求教高手说下程序哪里错了,还是思想就错了
#include<stdio.h>
#define MAX 100000
int g[256][256],q[256][256],max[256];
int n,re;
int alg()
{
int ma=MAX;
int i,j,k,x,m;
re=0;
for(i=1;i<=n;i++)
{
if(g[i][0]>=MAX)
break;
for(x=1;x<=n;x++)
{
for(m=1;m<=n;m++)
{
if(i!=m)
{
if(g[i][m]>=MAX&&g[g[i][0]][m]<MAX)
g[i][m]=g[g[i][0]][m]+g[i][g[i][0]];
else if(g[i][m]<MAX&&g[g[i][0]][m]<MAX)
{
if(g[g[i][0]][m]+g[i][g[i][0]]<g[i][m])
g[i][m]=g[g[i][0]][m]+g[i][g[i][0]];
}
}
}
q[i][g[i][0]]=1;
for(k=1;k<=n;k++)
if((g[i][k]<g[i][g[i][0]]||q[i][g[i][0]])&&!q[i][k]&&i!=k)
g[i][0]=k;
if(q[i][g[i][0]])
break;
}
for(j=1;j<=n;j++)
{
if(i!=j)
{
if((g[i][j]>max[i]||max[i]>=MAX)&&g[i][j]<MAX)
max[i]=g[i][j];
if(g[i][j]>=MAX)
{
max[i]=MAX;
break;
}
}
}
}
for(i=1;i<=n;i++)
if((max[i]<ma)&&max[i]<MAX)
{
ma=max[i];
re=i;
}
return ma;
}
int main()
{
int o,w,x,c;
int ma;
int i,j;
while(scanf("%d",&n)==1&&n)
{
for(i=0;i<256;i++)
{
max[i]=MAX;
for(j=0;j<256;j++)
{
g[i][j]=MAX;
q[i][j]=0;
}
}
for(i=1;i<=n;i++)
{
scanf("%d",&o);
for(w=1;w<=o;w++)
{
scanf("%d%d",&x,&c);
g[i][x]=c;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if((g[i][j]<g[i][0]||g[i][0]>=MAX)&&g[i][j]<MAX&&i!=j)
g[i][0]=j;
}
}
ma=alg();
if(n==1)
printf("%d 0\n",n);
else if(ma<MAX)
printf("%d %d\n",re,ma);
else printf("disjoint\n");
}
}
2009年03月26日 09点03分
1
http://210.32.0.220/onlinejudge/showProblem.do?problemId=82
下面是我写的一段程序
结果与例题的结果一样,求教高手说下程序哪里错了,还是思想就错了
#include<stdio.h>
#define MAX 100000
int g[256][256],q[256][256],max[256];
int n,re;
int alg()
{
int ma=MAX;
int i,j,k,x,m;
re=0;
for(i=1;i<=n;i++)
{
if(g[i][0]>=MAX)
break;
for(x=1;x<=n;x++)
{
for(m=1;m<=n;m++)
{
if(i!=m)
{
if(g[i][m]>=MAX&&g[g[i][0]][m]<MAX)
g[i][m]=g[g[i][0]][m]+g[i][g[i][0]];
else if(g[i][m]<MAX&&g[g[i][0]][m]<MAX)
{
if(g[g[i][0]][m]+g[i][g[i][0]]<g[i][m])
g[i][m]=g[g[i][0]][m]+g[i][g[i][0]];
}
}
}
q[i][g[i][0]]=1;
for(k=1;k<=n;k++)
if((g[i][k]<g[i][g[i][0]]||q[i][g[i][0]])&&!q[i][k]&&i!=k)
g[i][0]=k;
if(q[i][g[i][0]])
break;
}
for(j=1;j<=n;j++)
{
if(i!=j)
{
if((g[i][j]>max[i]||max[i]>=MAX)&&g[i][j]<MAX)
max[i]=g[i][j];
if(g[i][j]>=MAX)
{
max[i]=MAX;
break;
}
}
}
}
for(i=1;i<=n;i++)
if((max[i]<ma)&&max[i]<MAX)
{
ma=max[i];
re=i;
}
return ma;
}
int main()
{
int o,w,x,c;
int ma;
int i,j;
while(scanf("%d",&n)==1&&n)
{
for(i=0;i<256;i++)
{
max[i]=MAX;
for(j=0;j<256;j++)
{
g[i][j]=MAX;
q[i][j]=0;
}
}
for(i=1;i<=n;i++)
{
scanf("%d",&o);
for(w=1;w<=o;w++)
{
scanf("%d%d",&x,&c);
g[i][x]=c;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if((g[i][j]<g[i][0]||g[i][0]>=MAX)&&g[i][j]<MAX&&i!=j)
g[i][0]=j;
}
}
ma=alg();
if(n==1)
printf("%d 0\n",n);
else if(ma<MAX)
printf("%d %d\n",re,ma);
else printf("disjoint\n");
}
}