64,645
社区成员
发帖
与我相关
我的任务
分享
for(i=0 ; i< m ;i++)
{
scanf("%d%d",&a,&b);
//if there is no link in the set, add one road
if(city[a] != 1 && city[b] != 1 )
{
count++;
}
city[a] =1;
city[b] =1;
}
int Getfa( int t ) //找父亲
{
if( fa[t] == t ) return t;
fa[t] = Getfa(fa[t]);
return fa[t];
}
int Getfa( int t ) //找父亲
{
while( fa[t] != t)
{
t= fa[t];
//printf("%d,",t);//output the load
}
return t;
}
for ( j=0; j<n; j++ )
if ( city[j] == temp ) city[j] = city[b];
这里的 j的范围不对。[/quote]
对的,就是这里!!! 十分感谢! 看来我还是要多练习呀, 思维不够严谨的。#include <stdio.h>
int city[1005];
int main()
{
int n,m;
int count=0;
while(1)
{
scanf("%d",&n);
if( n == 0)
{
break;
}
scanf("%d",&m);
int i,a,b,temp,j;
int unionIndex = 0;
int unionNum = 0;
for ( i=1; i<=n; i++ ) city[i] = -1;//2、城市编号从1开始
for ( i=0; i<m; i++ )
{
scanf("%d%d",&a,&b);
if ( a == b ) continue;
if ( (city[a] == -1) && ( city[b] == -1 ) )
{
city[a] = unionIndex;
city[b] = unionIndex++;
unionNum++;
}
else if ( (city[a] != -1) && ( city[b] == -1 ) )
{
city[b] = city[a];
}
else if ( (city[a] == -1) && ( city[b] != -1 ) )
{
city[a] = city[b];
}
//缺少对后期连接了两个集合的判断, 可以减少独立集合数
//1、缺少对 输入的两个数本身就是一个集合的判断,这时不需要减少独立集合数
else if ( (city[a] != city[b]) && (city[a] != -1) && ( city[b] != -1 ) )
{
//对所有等于a集合标志的元素,归并成b集合标志的元素
temp = city[a];
for ( j=0; j<n; j++ )
if ( city[j] == temp ) city[j] = city[b];
unionNum--;
}
}
for ( i=1; i<=n; i++ )
{
if ( city[i] == -1 ) unionNum++;
}
//
//到目录为止一共有unionNum个联通集,则至少需要再添unionNum-1条路
printf( "%d\n", unionNum-1 );
}
return 0;
}
漏了一种情况我补充了一下。[/quote]
那个地方不对for ( j=0; j<n; j++ )
if ( city[j] == temp ) city[j] = city[b];
这里的 j的范围不对。#include <stdio.h>
int city[1005];
int main()
{
int n,m;
int count=0;
while(1)
{
scanf("%d",&n);
if( n == 0)
{
break;
}
scanf("%d",&m);
int i,a,b,temp,j;
int unionIndex = 0;
int unionNum = 0;
for ( i=1; i<=n; i++ ) city[i] = -1;//2、城市编号从1开始
for ( i=0; i<m; i++ )
{
scanf("%d%d",&a,&b);
if ( a == b ) continue;
if ( (city[a] == -1) && ( city[b] == -1 ) )
{
city[a] = unionIndex;
city[b] = unionIndex++;
unionNum++;
}
else if ( (city[a] != -1) && ( city[b] == -1 ) )
{
city[b] = city[a];
}
else if ( (city[a] == -1) && ( city[b] != -1 ) )
{
city[a] = city[b];
}
//缺少对后期连接了两个集合的判断, 可以减少独立集合数
//1、缺少对 输入的两个数本身就是一个集合的判断,这时不需要减少独立集合数
else if ( (city[a] != city[b]) && (city[a] != -1) && ( city[b] != -1 ) )
{
//对所有等于a集合标志的元素,归并成b集合标志的元素
temp = city[a];
for ( j=0; j<n; j++ )
if ( city[j] == temp ) city[j] = city[b];
unionNum--;
}
}
for ( i=1; i<=n; i++ )
{
if ( city[i] == -1 ) unionNum++;
}
//
//到目录为止一共有unionNum个联通集,则至少需要再添unionNum-1条路
printf( "%d\n", unionNum-1 );
}
return 0;
}
漏了一种情况我补充了一下。[/quote]
把while循环去掉试试。#include <stdio.h>
int city[1005];
int main()
{
int n,m;
int count=0;
while(1)
{
scanf("%d",&n);
if( n == 0)
{
break;
}
scanf("%d",&m);
int i,a,b,temp,j;
int unionIndex = 0;
int unionNum = 0;
for ( i=1; i<=n; i++ ) city[i] = -1;//2、城市编号从1开始
for ( i=0; i<m; i++ )
{
scanf("%d%d",&a,&b);
if ( a == b ) continue;
if ( (city[a] == -1) && ( city[b] == -1 ) )
{
city[a] = unionIndex;
city[b] = unionIndex++;
unionNum++;
}
else if ( (city[a] != -1) && ( city[b] == -1 ) )
{
city[b] = city[a];
}
else if ( (city[a] == -1) && ( city[b] != -1 ) )
{
city[a] = city[b];
}
//缺少对后期连接了两个集合的判断, 可以减少独立集合数
//1、缺少对 输入的两个数本身就是一个集合的判断,这时不需要减少独立集合数
else if ( (city[a] != city[b]) && (city[a] != -1) && ( city[b] != -1 ) )
{
//对所有等于a集合标志的元素,归并成b集合标志的元素
temp = city[a];
for ( j=0; j<n; j++ )
if ( city[j] == temp ) city[j] = city[b];
unionNum--;
}
}
for ( i=1; i<=n; i++ )
{
if ( city[i] == -1 ) unionNum++;
}
//
//到目录为止一共有unionNum个联通集,则至少需要再添unionNum-1条路
printf( "%d\n", unionNum-1 );
}
return 0;
}
漏了一种情况我补充了一下。
int unionIndex = 0;
int unionNum = 0;
for ( i=0; i<n; i++ ) city[i] = -1;//假设城市编号从0开始
for ( i=0; i<m; i++ )
{
scanf("%d%d",&a,&b);
if ( a == b ) continue;
if ( (city[a] == -1) && ( city[b] == -1 ) )
{
city[a] = unionIndex;
city[b] = unionIndex++;
unionNum++;
}
else if ( (city[a] != -1) && ( city[b] == -1 ) )
{
city[b] = city[a];
}
else if ( (city[a] == -1) && ( city[b] != -1 ) )
{
city[a] = city[b];
}
else if ( (city[a] != -1) && ( city[b] != -1 ) )
{
temp = city[a];
for ( j=0; j<n; j++ )
if ( city[j] == temp ) city[j] = city[b];
unionNum--;
}
}
for ( i=0; i<n; i++ )
{
if ( city[i] == -1 ) unionNum++;
}
//到目录为止一共有unionNum个联通集,则至少需要再添unionNum-1条路
printf( "%d ", unionNum-1 );