您的位置:首页 > 其它

HDU 1879 还是prim最小生成树、

2016-02-27 20:01 246 查看
#include<stdio.h>
#include<math.h>
#include<string.h>
const int qq=100+10,MAX=1e7;
int vis[qq];
int lowcost[qq][qq];
int minimum[qq];
int n;
void prim()
{
int minx,k;
int sum=0;
vis[1]=1;
for(int i=0;i<=n+1;++i)
minimum[i]=lowcost[1][i];
for(int i=1;i<n;++i){
minx=MAX;
for(int j=1;j<=n;++j)
if(!vis[j] && minx > minimum[j]){
minx=minimum[j];
k=j;
}
vis[k]=1;
sum+=minx;
for(int l=1;l<=n;++l)
if(!vis[l] && minimum[l] > lowcost[k][l])
minimum[l]=lowcost[k][l];
}
printf("%d\n",sum);
}
int main()
{
while(~scanf("%d",&n)&&n){
for(int i=0;i<=n+1;++i)
minimum[i]=MAX;
for(int j,i=0;i<=n+1;++i)
for(j=0;j<=n+1;++j)
lowcost[i][j]=MAX;
for(int i=0;i<=n+1;++i)
vis[i]=0;
int i,j,cost,mark;
for(int l=1;l<=n*(n-1)/2;++l){
scanf("%d %d %d %d",&i,&j,&cost,&mark);
if(mark==1){
lowcost[i][j]=lowcost[j][i]=0;            //已经存在路径的话直接权值为0
}
else
lowcost[i][j]=lowcost[j][i]=(i==j)?0:cost;
}
prim();
}
}


最开始调试的时候好像memset函数使用错误,我把第二个参数写的MAX开始RE或者PE, 最后迫于无奈,直接用循环来初始化

后来标记已经存在的路径vis分别标记i,j为1;这样我就分了三种情况讨论第一是已经标记过的点位0个,第二是已经标记过的点位n个,0~n之间就是第三种情况,调了半天发现WA了几次、最后还是直接套用prim算法来的准确,所以就说已存在路径的值直接赋值0好了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: