AC题,最小生成树,kruskal算法,不知道哪错了,牛人帮忙看看呀……

welon123 2010-11-07 10:00:58
http://acm.hdu.edu.cn/showproblem.php?pid=1863
#include<iostream>
#include<cstdlib>
using namespace std;

typedef struct
{
int x, y;
int w;
}edge;

const int MAX = 101;
const int MAXN = 10001;
edge e[MAXN];
int ans, m;

int height[101];
int pa[101];

void make(int x)
{
pa[x] = x;
height[x] = 0;
}

int find(int x)
{
if(x != pa[x])
pa[x] = find(pa[x]);
return pa[x];
}

void merge(int x, int y, int w)
{
x = find(x);
y = find(y);
ans += w;
if(height[x] == height[y])
{
pa[x] = y;
height[x]++;
}
else if(height[x] > height[y])
{
pa[y] = x;
}
else
{
pa[x] = y;
}
}

bool judge()
{
for(int i = 2; i <= m; i++)
if(pa[i] != pa[1])
return 0;
return 1;
}

int cmp(const void *a, const void *b)
{
return ((edge *)a) -> w - ((edge *)b) -> w;
}

int main()
{
int n, x, y, i, ans;
while(cin >> n >> m, n){
for(i = 1; i <= m; i++)
make(i);

for(i = 0; i < n; i++)
cin >> e[i].x >> e[i].y >> e[i].w;

qsort(e, n, sizeof(e[0]), cmp);

ans = 0;
for(i = 0; i < n; i++)
{
x = find(e[i].x);
y = find(e[i].y);
if(x != y)
merge(x, y, e[i].w);
}

for(i = 1; i <= m; i++)
find(i);

if(judge())
cout << ans << endl;
else
puts("?");
}
return 0;
}




...全文
143 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2010-11-07
  • 打赏
  • 举报
回复
...库鲁斯卡尔算法,是那个并查集的算法么?

还有prim,就是那个贪心算法么.
welon123 2010-11-07
  • 打赏
  • 举报
回复
谢谢楼上了,测试数据通过了,可是提交还是WA,这是什么情况……
#include<iostream>
#include<cstdlib>
using namespace std;

typedef struct
{
int x, y;
int w;
}edge;

const int MAX = 100;
const int MAXN = 10001;
edge e[MAXN];
int ans = 0, m;

int height[100];
int pa[100];

void make(int x)
{
pa[x] = x;
height[x] = 0;
}

int find(int x)
{
if(x != pa[x])
pa[x] = find(pa[x]);
return pa[x];
}

void merge(int x, int y, int w)
{
x = find(x);
y = find(y);
ans += w;
if(height[x] == height[y])
{
pa[x] = y;
height[x]++;
}
else if(height[x] > height[y])
{
pa[y] = x;
}
else
{
pa[x] = y;
}
}

bool judge()
{
for(int i = 2; i <= m; i++)
if(pa[i] != pa[1])
return 0;
return 1;
}

int cmp(const void *a, const void *b)
{
return ((edge *)a) -> w - ((edge *)b) -> w;
}

int main()
{
int n, x, y, i;
while(cin >> n >> m, n){
for(i = 1; i <= m; i++)
make(i);

for(i = 0; i < n; i++)
cin >> e[i].x >> e[i].y >> e[i].w;

qsort(e, n, sizeof(e[0]), cmp);

for(i = 0; i < n; i++)
{
x = find(e[i].x);
y = find(e[i].y);
if(x != y)
merge(x, y, e[i].w);
}

for(i = 1; i <= m; i++)
find(i);

if(judge())
cout << ans << endl;
else
puts("?");
}
return 0;
}




無_1024 2010-11-07
  • 打赏
  • 举报
回复

#include<iostream>
#include<cstdlib>
using namespace std;

typedef struct
{
int x, y;
int w;
}edge;

const int MAX = 101;
const int MAXN = 10001;
edge e[MAXN];
int ans = 0, m;//在这儿对ans初始化 定义一个全局变量
int height[101];
int pa[101];

void make(int x)
{
pa[x] = x;
height[x] = 0;
}

int find(int x)
{
if(x != pa[x])
pa[x] = find(pa[x]);
return pa[x];
}

void merge(int x, int y, int w)
{
x = find(x);
y = find(y);
ans += w;
if(height[x] == height[y])
{
pa[x] = y;
height[x]++;
}
else if(height[x] > height[y])
{
pa[y] = x;
}
else
{
pa[x] = y;
}
}

bool judge()
{
for(int i = 2; i <= m; i++)
if(pa[i] != pa[1])
return 0;
return 1;
}

int cmp(const void *a, const void *b)
{
return ((edge *)a) -> w - ((edge *)b) -> w;
}

int main()
{
int n, x, y, i;//这儿不要在定义ans的局部变量
while(cin >> n >> m, n){
for(i = 1; i <= m; i++)
make(i);

for(i = 0; i < n; i++)
cin >> e[i].x >> e[i].y >> e[i].w;

qsort(e, n, sizeof(e[0]), cmp);
//ans = 0;不需要了
for(i = 0; i < n; i++)
{
x = find(e[i].x);
y = find(e[i].y);
if(x != y)
{
merge(x, y, e[i].w);
}
}

for(i = 1; i <= m; i++)
find(i);

if(judge())
cout << ans << endl;
else
puts("?");
}
return 0;
}


無_1024 2010-11-07
  • 打赏
  • 举报
回复
就是那个全局变量和局部变量的问题
logiciel 2010-11-07
  • 打赏
  • 举报
回复
#include<iostream>
#include<cstdlib>
using namespace std;

typedef struct
{
int x, y;
int w;
}edge;

const int MAX = 101; //不够 const int MAX = 100;
//多了 const int MAXN = 10001;
edge e[MAX]; //edge e[MAXN];
int ans = 0, m;

//int height[100];
int pa[MAX]; //int pa[100];

void make(int x)
{
pa[x] = x;
//height[x] = 0;
}

int find(int x)
{
/*
if(x != pa[x])
pa[x] = find(pa[x]);
return pa[x];
*/
int y = x;
while (y != pa[y]) y = pa[y];
return y;
}

void merge(int x, int y, int w)
{
//x = find(x);
//y = find(y);
ans += w;
/*
if(height[x] == height[y])
{
pa[x] = y;
height[x]++;
}
else if(height[x] > height[y])
*/
if (x < y)
{
pa[y] = x;
}
else
{
pa[x] = y;
}
}

/*
bool judge()
{
for(int i = 2; i <= m; i++)
if(pa[i] != pa[1])
return 0;
return 1;
}
*/

int cmp(const void *a, const void *b)
{
return ((edge *)a) -> w - ((edge *)b) -> w;
}

int main()
{
int n, x, y, i;
while(cin >> n >> m, n){
int count;
ans = 0; //对每个case都要清ans
for(i = 1; i <= m; i++)
make(i);

for(i = 0; i < n; i++)
cin >> e[i].x >> e[i].y >> e[i].w;

qsort(e, n, sizeof(e[0]), cmp);

for(i = 0, count = 1; count < m && i < n; i++)
{
x = find(e[i].x);
y = find(e[i].y);
if(x != y)
{
count++;
merge(x, y, e[i].w);
}
}

/*
for(i = 1; i <= m; i++)
find(i);*/

if (count == m) //if(judge())
cout << ans << endl;
else
puts("?");
}
return 0;
}

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧