求大神指点为何只有30分。。

#include<cstdio>
#include<queue>
using namespace std;
queue<int> q;
int n,m,num;
int start,end;
int a[1010][1010],f[1010][1010];
int head[1000010],next[6000010],to[6000010],size[6000010];
bool b[1000010];
int dis[1000010];
void build(int x1,int y1,int x2,int y2)
{
int t1=f[x1][y1];
int t2=f[x2][y2];
next[++m]=head[t1];
head[t1]=m;
to[m]=t2;
size[m]=a[x2][y2];
next[++m]=head[t2];
head[t2]=m;
to[m]=t1;
size[m]=a[x1][y1];
}
void spfa()
{
while (!q.empty())
{
int t=q.front();
q.pop();
b[t]=0;
int x=head[t];
while (x)
{
if (dis[t]+size[x]<dis[to[x]])
{
dis[to[x]]=dis[t]+size[x];
if (!b[to[x]])
{
q.push(to[x]);
b[to[x]]=1;
}
}
x=next[x];
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=0;j<i;j++)
{
num++;
f[i][j]=num;
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<i;j++)
{
scanf("%d",&a[i][j]);
if ((i-1)&&j)
{
build(i,j,i,j-1);
build(i,j,i-1,j-1);
if (j==i-1) build(i,j,i-1,0);
else build(i,j,i-1,j);
}
else if (i-1)
{
build(i,j,i,i-1);
build(i,j,i-1,0);
build(i,j,i-1,i-2);
}
}
}
start=f[n][0];
end=f[1][0];
q.push(start);
for(int i=1;i<=num;i++) dis[i]=23333333;
dis[start]=a[n][0];
spfa();
printf("%d\n",dis[end]);
return 0;
}

0 条评论

目前还没有评论...

信息

ID
1006
难度
6
分类
动态规划 点击显示
标签
递交数
8992
已通过
2077
通过率
23%
被复制
26
上传者