锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 濡傛灉鍘熷妯″瀷鏄浜庨泦鍚堜箣闂村悎騫跺鐞嗛棶棰橈紝閭d箞灝卞彲浠ヤ嬌鐢ㄥ茍鏌ラ泦浣垮緱紼嬪簭鍙樺緱楂樻晥銆?/span> 騫舵煡闆嗙殑璺緞鍘嬬緝鍙湁鍦ㄥ厓绱犱箣闂寸殑鐗規у瓨鍦ㄩ掓帹鍏崇郴鏃舵墠鍙互浣跨敤銆?br>
榪欓噷鐢╯ign 鏍囪鏄惁鍑虹幇浜嗗悓鏍癸紝鍒嗕袱縐嶆儏鍐靛鐞嗗嵆鍙紝涔焀A 浜嗗嚑嬈★紝鍥犱負澶嶅埗綺樿創鎶婇偅涓眰minn 鍜?maxn 寮勯敊浜?br> 榪樻湁灝辨槸娌″鐞嗕竴緇勮緭鍏ョ殑鏃跺欎竴瀹氳閬垮厤涓婁竴緇勮緭鍏ョ殑褰卞搷錛岄偅灝辨槸鍒濆鍖?br>鍏朵粬鐨勫氨鏄鐢ㄥ茍鏌ョН鐨勬ā鏉垮氨鍙互浜?br>
#include <iostream>
#include <string>
using namespace std;
struct node 

{
int parent;
int weight;
};
node maze[100001];
int visit[100001]; //鏄泦鍚堜腑鐨勫厓绱犻兘琚爣璁?/span>
int findfather ( int i )

{
while ( i != maze[i].parent )
i = maze[i].parent;
return i;
}
void merge ( int a, int b )

{
if ( maze[a].weight == maze[b].weight )
{
maze[b].parent = a;
maze[a].weight = b;
}
else if ( maze[a].weight > maze[b].weight )
maze[b].parent = a;
else
maze[a].parent = b;
} 
int main ()

{
int a, b, a1, b1, sign;
while ( scanf ("%d %d", &a, &b) != EOF )
{
memset (visit , 0, sizeof (visit));
int maxn = 0;
int minn = 1000000;
//騫舵煡縐畻娉曠殑鍒濆鍖?/span>
for ( int i = 1; i < 100001; i ++ )
{
maze[i].parent = i;
maze[i].weight = 1;
}
if ( a == -1 && b == -1 )
break;
if ( a == 0 && b == 0 )
{
printf ("Yes\n");
continue;
}
sign = 0; 
do
{
if ( a < minn ) minn = a; //鎵懼埌杈撳叆 鐨勬墍鏈夋暟鎹腑鏈灝忕殑鍜屾渶澶х殑渚夸簬鍑忓皬鏈鍚庢暟緇勯亶鍘嗘椂鐨勫鏉傚害
if ( b < minn ) minn = b;
if ( a > maxn ) maxn = a;
if ( b > maxn ) maxn = b;
visit[a] = visit[b] = 1;
a1 = findfather (a);
b1 = findfather (b);
if ( a1 == b1 ) //鑺傜偣鍚屾牴 
{
sign = -1;
}
else
merge (a1, b1);
scanf ("%d %d", &a, &b);
if ( a== 0 && b == 0)
break;
}while (1);
if ( sign == -1 ) 
{
printf ("No");
}
//閬嶅巻騫舵煡縐湅鏈夊嚑涓牴鑺傜偣
if ( sign == 0 )
{
for (int i = minn; i <= maxn; i ++)
{
if ( visit[i] && maze[i].parent == i )
sign ++;
}
if (sign == 1)
printf ("Yes\n");
else
printf ("No\n");
}
}
//system ("pause");
return 0;
}
]]>
鍏抽敭鏄鐞嗚В閭d袱涓皟鐢ㄧ殑鍑芥暟錛屼互鍙婄敤鏍戠粨鏋勫鐞嗘椂瑕佹敞鎰忕殑闂錛?br>1.鍚堝茍鐨勬椂鍊欒娉ㄦ剰鏄皢楂樺害杈冨皬鐨勬爲鍚堝茍鍒伴珮搴﹁緝澶х殑鏍戯紝鎵浠ュ皬鏍戠殑parent鎸囧悜澶ф爲鏍硅妭鐐?br>2.涓瀹氳鐞嗚В涓鐐瑰氨鏄悎騫朵袱涓妭鐐瑰疄闄呬笂鏄悎騫朵粬浠殑鏍硅妭鐐癸紝鎵浠ヤ竴瀹氳鎵懼埌鑺傜偣錛屾壘鍒版椂鍊欑悊瑙eソ涔熷氨鏄負浠涔坒indfather涓負浠涔堣鐢╳hile鐨勫師鍥犱簡
//姝ら榪愮敤騫舵煡縐細灝辨槸灝嗘墍鏈夌殑鏉戝簞鏀懼埌涓涓泦鍚堜腑
#include <iostream>
#include <string>
using namespace std;
struct node

{
int parent;
int height;
};
node village[1000];
//鎵炬牴鑺傜偣
int findfather (int a)

{
while ( a != village[a].parent ) //鐞嗚Вwhile 鏍戠姸緇撴瀯錛氭壘鍒版渶緇堢殑璺熻妭鐐?br>
a = village[a].parent;
return a;
}
//鍚堝茍鍒板悓涓闆嗗悎
void merge (int a, int b) //娉ㄦ剰鍙傛暟錛氳鍚堝茍涓や釜鑺傜偣鐨勬牴 

{
if ( village[a].height == village[b].height )
{
village[b].parent = a;
village[a].height ++;
}
//灝忔爲鍚堝茍鍒板ぇ鏍?nbsp;
else if ( village[a].height > village[b].height ) 
{
village[b].parent = a;
}
else
village[a].parent = b;
} 
int main ()

{
int n, m;
while ( scanf ("%d", &n) != EOF && n)
{
for (int i = 1; i <= n; i ++) //鏍規嵁騫舵煡縐殑綆楁硶錛屽厛灝嗘暟緇勫垵濮嬪寲錛岃瀹氭湰韜負涓涓嫭绔嬬殑闆嗗悎錛屽茍涓旈珮搴﹂兘鏄?nbsp;1 
{
village[i].parent = i;
village[i].height = 1;
}
scanf ("%d", &m);
int a, b;
int a1, b1;
for (int i = 0; i < m; i ++)
{
scanf ("%d %d", &a, &b); //鎵懼嚭瑕佸茍鍏ラ泦鍚堢殑鍏冪礌鐨勬牴錛屽鏋滄牴鑺傜偣鐩稿悓鍒欎笉騫跺叆鍚屼竴涓泦鍚堬紝鍙嶄箣錛屽垯騫跺叆鍒板悓涓涓泦鍚?br>
a1 = findfather (a);
b1 = findfather (b);
if ( a1 != b1 ) //褰撴牴鑺傜偣涓嶅悓鏃跺悎騫惰窡鑺傜偣
merge (a1, b1);
}
//鏈鍚庨亶鍘嗗茍鏌ョН鏁扮粍鐪嬬湅涓鍏辨湁鍑犱釜涓嶅悓鐨勯泦鍚?br>
int sum = -1;
for (int i = 1; i <= n; i ++)
{
if ( i == village[i].parent )
sum ++;
}
printf ("%d\n", sum);
}
//system ("pause");
return 0;
}
]]>