acm-ACM HDU1879继续畅通工程 提交RE.求各路大神帮忙看一下哪儿错了

问题描述

ACM HDU1879继续畅通工程 提交RE.求各路大神帮忙看一下哪儿错了

题目大意:
求最小生成树的权值和,并输出。已经修建的路(已经连上的边)是不会算入到最后的ANS中。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。

当N为0时输入结束。

Sample Input

3
1 2 1 0
1 3 2 0
2 3 4 0
3
1 2 1 0
1 3 2 0
2 3 4 1
3
1 2 1 0
1 3 2 1
2 3 4 1
0

Sample Output

3
1
0

我的思路:就是把创建部分稍微做点修改,改成如果修建过,则此边的权值为0。
我出现的问题:我是初学PRIM,算法是自己根据定义写的,可能比较毛糙,问题不知道出在哪儿。提交上去是RE,(ACCESS_VIOLATION)。我仔细看过数组是否越界,我并没有看出有越界的地方。
上一道HDU1863畅通工程,同类型的题目我用这个算法AC了。
所以现在不知道错误在哪儿,请求各位指点一二。

下面是我的代码,运行没有问题,样例也通过。。。
#include "iostream"
#include "algorithm"
using namespace std;
typedef struct
{
int from;
int to;
int value; //权值
bool used; //是否被标记过
bool now; //是否为待选直接相邻边
}Edge;
Edge e[105];
bool V[105];//顶点集。
const int Inf=10000000;
bool Mycmp(Edge A,Edge B)
{
return A.value<B.value;
}

void Create(int n)
{
int i,length=0,Q;

for(i=0;i
V[i]=false;
for(i=0;i
e[i].used=false;
for(i=0;i
{
cin>>e[i].from>>e[i].to>>e[i].value>>Q;
if(Q==1)
e[i].value=0;
}
stable_sort(e,e+n,Mycmp);

}
void Find(int n,int from) //用来找出和这个顶点直接相连的边。
{
int i;
for(i=0;i<n;i++)
{
if(e[i].used==false&&(e[i].from==from||e[i].to==from))

{
if(V[e[i].from]==true&&V[e[i].to]==true) //用于判断是否会构成环
continue;
e[i].now=true;
}
}

}
void Clear(int n)
{
for(int i=0;i<n;i++)
e[i].now=false;

}

int Prim(int n,int m)
{
int i,from,to,j,jindex,value,min,ans=0;
from=e[0].from;

to=e[0].to;
e[0].used=true;
V[from]=true;

V[to]=true;
ans+=e[0].value;
for(i=1;i
{
Clear(n);
for(j=1;j
{
if(V[j]==true) //顺着顶点,把边挑选出来
{
Find(n,j);
}
}
min=Inf;
jindex=-1;
for(j=0;j
{
if(e[j].now==true)
{
if(min>e[j].now)
{
min=e[j].now;
jindex=j;
}
}
}

    e[jindex].used=true;    //找到合适的边
    V[e[jindex].from]=true;
    V[e[jindex].to]=true;
    ans+=e[jindex].value;

}
return ans;

}

int main()
{
int n,m,ans,t,flag;
while(cin>>m)
{

    if(m==0)    //题意,如果为0则跳出
        break;
    n=m*(m-1)/2;
  Create(n);
 ans=Prim(n,m);
    cout<<ans<<endl;
}
return 0;

}

解决方案

算法有问题

 /*
hdu1879
2013-03-18 15:25:50    Accepted    1879    406MS    360K    1188 B
典型的最小生成树,在做并查集时做的这道题,
所以使用并查集实现的克鲁斯卡尔算法
*/
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

struct node {
    int start ,end,expense,flag;
}data[5005];

int father[105];
void make_set(int n)
{
    for(int i=1;i<=n;i++)
        father[i]=i;
}
int find_set(int x)
{
    if(x^father[x])
        father[x]=find_set(father[x]);
    return father[x];
}
int union_set(int x,int y)
{
    x=find_set(x);
    y=find_set(y);
    if(x==y)
        return 0;
    father[x]=y;
    return 1;
}
bool cmp(node a,node b)
{
    return a.expense<b.expense;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(!n)
            break;
        make_set(n);
        int ans=0;
        int m=(n-1)*n/2;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d%d",&data[i].start,&data[i].end,&data[i].expense,&data[i].flag);
            if(data[i].flag)//当道路修通时,规定一节点为另一节点的父亲
                father[data[i].start]=data[i].end;
        }
        sort(data,data+m,cmp);//按道路的花费升序排列

        //在不构成环的前提下,选择最短的边,有贪心的思想
        for(int i=0;i<m;i++)
        {
            if(union_set(data[i].start,data[i].end))
                ans+=data[i].expense;
        }
        printf("%dn",ans);
    }
    return 0;
}
时间: 2024-08-03 01:19:01

acm-ACM HDU1879继续畅通工程 提交RE.求各路大神帮忙看一下哪儿错了的相关文章

alert-点击提交按钮的时候没有反应,麻烦大神帮忙看一下是什么问题

问题描述 点击提交按钮的时候没有反应,麻烦大神帮忙看一下是什么问题 <!-- .STYLE1 {color: #FF0000} --> ? function check() { if (document.FORM10.zh.value=="") { alert("用户名必填!"); document.FORM10.zh.focus(); return false; } FORM10.submit(); } 信息录入 账号: 密码: 姓名: 科室: &qu

汇编-做对了 为什么提交不上去呢?求大神帮忙看下 奇数和偶数分离的问题

问题描述 做对了 为什么提交不上去呢?求大神帮忙看下 奇数和偶数分离的问题 #include //我感觉思路已经很清晰了 int main() { int array[10]; int arrayOdd[10][20]; int arrayEven[10][20]; int m , n , i , j; int Kodd=0,Keven=0; scanf("%d",&m); for( i = 1; i <= m; i++) { scanf("%d",&

MVC4实现论坛回复功能提交回复不成功,各位大神帮忙看看哈,研究了好长时间不知道帖子id怎么获取

问题描述 实现的思路是通过首页获取到所有帖子的标题和id信息点击帖子链接通过id找到帖子具体信息和回复信息,列表列出在下面有一个回复框,填写信息提交下面是代码首页获取帖子信息,通过href传值@modelJustStudent.Models.PostModel@{Layout=null;ViewBag.Title="Index";}<divid="post">@{for(inti=0;i<Model.listpost.Count;i++){<

代码-怎么用递归解决ACM的发工资问题,求各位大神帮助

问题描述 怎么用递归解决ACM的发工资问题,求各位大神帮助 假设老师的工资都是正整数,单位元,人民币一共有100元.50元.10元.5元.2元和1元六种. Sample Input 3 1 2 3 0 Sample Output 4 #include using namespace std; int salary(int a) { static int sum=0; if(a==0) { cout< return sum; } if(a>=100) { sum+=a/100; a=a%100;

gradle-向andriod studio中导入eclipse工程出错,求大神帮忙!!

问题描述 向andriod studio中导入eclipse工程出错,求大神帮忙!! Error:Could not find any version that matches com.android.tools.build:gradle:1.0.0.+. 第一次用andriod studio,不是很熟悉,按照网上的要求一步步操作,但是要出如上的错误,不知道怎么回事. 解决方案 问问3434嗡嗡嗡恶嗡嗡嗡 解决方案二: 问问3434嗡嗡嗡恶嗡嗡嗡 解决方案三: 问问3434嗡嗡嗡恶嗡嗡嗡 解决方

使用ext提交表单出错,求大神帮忙

问题描述 使用ext提交表单出错,求大神帮忙 jsp页面代码如下: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.or

myeclipse-运行java工程出现以下错误,大神们帮忙看一下吧,给点建议!

问题描述 运行java工程出现以下错误,大神们帮忙看一下吧,给点建议! 求各位指点迷津!我是用的myeclipse下tomcat6运行,可以跳出index.jsp登录页面,但是后台打印会有以上的错误.而且当我输入登录账号密码时又出现这种错误: 解决方案 把代码贴出来看看,造成这个异常的可能性很多 解决方案二: 你可以参考这篇博客的解决方案:http://blog.csdn.net/jaune161/article/details/18361421 解决方案三: 什么操作造成,在那一步的代码上找原

java-JAVA中的排序,最近有一个工程需要排序算法,求算法大神....

问题描述 JAVA中的排序,最近有一个工程需要排序算法,求算法大神.... 就是list中有一组数据(id),要求将id按照id的一个属性(age)进行两两分组. 若是偶数:按照**age之差最小**的两个id进行分组,两两一组. 若是奇数,则将一个id轮空,剩余id仍按照 age之差最小 这一条件进行两两分组. 求大神解救.或者说说一说思路也行... 解决方案 这里面会用到哪个函数?或者大概步骤是如何的,小白求大家尽量详细点说.... 解决方案二: 给出样例数据和预期的结果. 分组也可以用数据

图片-svn提交出错问题 球大神解释

问题描述 svn提交出错问题 球大神解释 在SVN提交的时候报这个错误 是什么意思 怎么解决 非常急 解决方案 你本地工作副本已经奔溃了,你试图清理下本地SVN副本试试 如果不行,重新选择个目录,重新更新下载 解决方案二: http://blog.chinaunix.net/uid-7483457-id-2624161.html参考下,备份有问题的目录,删除有问题的目录,更新下,然后将备份的内容覆盖有问题的目录再提交 解决方案三: http://blog.csdn.net/znn626/arti