解題レポート-PAT-FIle Transfer
2927 ワード
解題レポート-PAT-FIle Transfer
原題リンク:https://pta.patest.cn/pta/test/1342/exam/4/question/21732
タイトルの説明:
N個のノードと一連の文字列のシーケンスを入力します.
ここでCは、現在の3 2ノードが連通しているか否かを判断し、連通出力yesであれば出力noを連通しないことを示す.
Iは、ノード2 4を1つのセットにまとめることを示す.
Sは入力終了を示す.
最適化された並列調査セットを使用して問題を解くには、次の手順に従います.
いくつかの点に注意してください.
1)検索セットの検索を再帰的な方法に変更することができ,より簡潔であるが,理解しにくい.
2)入力が操作されていない可能性があり,Nを直接入力するとSが入力され,このときN個の構成部分が出力される.
3)この問題は配列を調べてまとめることができ,追加の情報を格納する必要がある場合は,厳格なデータ構造の紹介を参照することができる.
原題リンク:https://pta.patest.cn/pta/test/1342/exam/4/question/21732
タイトルの説明:
N個のノードと一連の文字列のシーケンスを入力します.
5
C 3 2
I 3 2
C 1 5
I 4 5
I 2 4
C 3 5
S
ここでCは、現在の3 2ノードが連通しているか否かを判断し、連通出力yesであれば出力noを連通しないことを示す.
Iは、ノード2 4を1つのセットにまとめることを示す.
Sは入力終了を示す.
最適化された並列調査セットを使用して問題を解くには、次の手順に従います.
# include
# include
# include
# define MAX 10100
using namespace std;
int S[MAX];
void Initial(int n){
for(int i=0;i<=n;i++)
S[i] = -1;
}
/*
int Find(int x){
if(S[x] != x)
S[x]=Find(S[x]);
return S[x];
}
*/
int Find(int x){
int k=x,t; //k 。
// S x
while(S[x] >= 0) //
x=S[x];
//x
// k ,k ,
while(k != x) {
t=k;
k = S[k];
S[t] = x;
}
return x;
}
int Union(int x,int y){ //
int fx,fy;
fx = Find(x);
fy = Find(y);
if(fx!=fy){
//
if(-(S[fx]) > -(S[fy])){
S[fx] = S[fx] + S[fy];
S[fy] = fx;
}else{
S[fy] = S[fx] + S[fy];
S[fx] = fy;
}
return 1;
}else return 0;// x,y
}
int main(){
int N,c1,c2;
char m;
cin >> N;
Initial(N);
cin >> m;
while(m!='S'){
scanf("%d %d",&c1,&c2);
if(m=='I'){
Union(c1,c2);
}else{
if(Find(c1) == Find(c2))
printf("yes
");
else
printf("no
");
}
cin >> m;
}
int co = 0;
for(int j=1;j<=N;j++){
if(S[j] < 0)
co++;
}
if(co == 1)
printf("The network is connected.
");
else
printf("There are %d components.
",co);
return 0;
}
いくつかの点に注意してください.
1)検索セットの検索を再帰的な方法に変更することができ,より簡潔であるが,理解しにくい.
2)入力が操作されていない可能性があり,Nを直接入力するとSが入力され,このときN個の構成部分が出力される.
3)この問題は配列を調べてまとめることができ,追加の情報を格納する必要がある場合は,厳格なデータ構造の紹介を参照することができる.
# define SIZE 100
// :
struct TreeNode{ //
char nameId; // A,B,C... ,
int parent; // ,
}TreeNode;
TreeNode treeNode[SIZE+1];
//
int find(TreeNode &treeNode,int x){// x
if(i<1 || i>100)//>100 >n,n
return -1;//
for(int i=x;treeNode[i].parent>0;i=treeNode[i].parent)
// i 0, ,
//
for(int k=x;k!=i;k=treeNode[k].parent)// x ,x 。
treeNode[k].parent=i; // i,i
return i;//
}
//
void meget(TreeNode &treeNode,int x,int y){
// x,y
int fx=find(x);
int fy=find(y);
// , , 。
if(treeNode[fx].parent>treeNode[fy].parent) // fx , parent 。
{
treeNode[fy].parent += treeNode[fx].parent; //
treeNode[fx].parent=fy;
}else{
treeNode[fx].parent += treeNode[fx].parent; //
treeNode[fy].parent=fx;
}
}