..................................................................
先无语,必须无语!!!!
应该说是一个很简单的题:赤裸的Dijsktra!
但是题意读不懂,用着有道+1个小时+坚强的意志=终于读懂了!。。。。。。。English。。。。。。。。。。
然后速想代码架构,速敲代码!!但是测试数据就错了!!!!!
最终调试!!发现定义最大值错了!!即#define MAX 0x7fffffff
这样一来,在最大值的基础上再加上一个数就越界了,可能就是负数!以至于更新dist的值整成负的了!!!
记住!这个错误,以后别犯了!!!
View Code
#include <stdio.h>
#include <string.h>
#define N 102
//#define MAX 0x7fffffff 草了!这次Dijsktra写的木一点问题,这里出问题了,窝里割草啊!
//这几把错的给力啊!
#define MAX 0xfffffff
int map[N][N];
int dist[N];
bool flag[N];
void Dijsktra(int s,int n)
{
int i,j,u;
for(i=1;i<=n;i++)
{
dist[i]=map[s][i];
flag[i]=false;
}
flag[s]=true;
for(i=1;i<n;i++)
{
for(u=s,j=1;j<=n;j++)
{
if(!flag[j] && dist[u]>dist[j])
{
u=j;
}
}
flag[u]=true;
for(j=1;j<=n;j++)
{
if(!flag[j] && (dist[u]+map[u][j]<dist[j]))
{
dist[j]=dist[u]+map[u][j];
}
}
}
}
int solve(int s,int n)
{
int i,j;
Dijsktra(s,n);
dist[s]=0;
for(j=i=1;i<=n;i++)
{
if(dist[j]<dist[i])
{
j=i;
}
}
return dist[j];
}
int getInt()
{
int ans=0;
char c;
while(((c=getchar())>'9' || c<'0') && (c!='x'));
while(c>='0' && c<='9')
{
ans=ans*10+c-'0';
c=getchar();
}
return ans?ans:MAX;
}
int main()
{
int i,j,n;
// freopen("input.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
map[i][j]=MAX;
}
for(i=2;i<=n;i++)
{
for(j=1;j<i;j++)
{
map[j][i]=map[i][j]=getInt();
}
}
printf("%d\n",solve(1,n));
}
return 0;
}