想求助下问什么我在下面代码中,memset()函数放在Prim()函数中提交会报:Runtime Error
但是放在主函数中则AC
/**无向图求最小生成树*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define Max 999999 //设置一个最大值
using namespace std;
int n,m; //n表示结点个数、m表示边的条数
int vis[1010]; //判断结点是否访问
int mp[1010][1010]; //无向图邻接矩阵
int cost[1010]; //最小生成树每条边权值
/**初始化邻接矩阵*/
void init()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)
mp[i][j]=0;
else
mp[i][j]=Max;
}
}
}
/**Prim算法*/
void Prim()
{/**以顶点0为出发点*/
//memset(vis,0,sizeof(vis)); //放在这会Runtime Error。。。
for(int i=1;i<n;i++)
{
cost[i]=mp[0][i];
}
cost[0]=0;
vis[0]=1;
for(int i=0;i<n;i++)
{
int Min=Max+1;
int pos;
for(int j=0;j<n;j++)
{
if(cost[j]<Min&&vis[j]==0)
{
pos=j;
Min=cost[j];
}
}
vis[pos]=1;
for(int j=0;j<n;j++)
{
if(vis[j]==0&&mp[pos][j]<cost[j])
{
cost[j]=mp[pos][j];
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
/**无语,这个必须放在这*/
memset(vis,0,sizeof(vis));
int a,b,v; //表示两个结点a、b与相连接的一条边上的权值v
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&v);
if(mp[a][b]>v)
{
mp[a][b]=mp[b][a]=v; //由于是无向图,所有保持对称矩阵
}
}
Prim();
int sum=0; //记录最小生成树所有边的权值
for(int i=1;i<n;i++)
{
sum+=cost[i];
}
if(sum>Max)
printf("impossible\n");
else
printf("%d\n",sum);
printf("\n");
}
return 0;
}