PTA 7-10 排座位
这道题中,因为朋友关系是可以传递的,所以我们用并查集来储存朋友关系。敌对关系不可传递,所以我们用一个邻接表储存敌对关系。再根据题目要求进行输出
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>
using namespace std;
int pre[1010];
int Map[1010][1010];
//并查集模板
int Find(int x)
{
while(x!=pre[x])
x = pre[x];
return x;
}
void Merge(int x,int y)
{
int fx = Find(x);
int fy = Find(y);
if(fx!=fy)
pre[fx] = fy;
}
int main()
{
int n,m,k;
cin>>n>>m>>k;
memset(Map,0,sizeof(Map));
for(int i=1;i<=n;i++)//初始化
pre[i] = i;
for(int i=1;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
if(c==-1)//储存敌对关系
Map[a][b] = Map[b][a] = -1;
else//朋友关系用并查集处理
Merge(a,b);
}
for(int i=1;i<=k;i++)
{
int x,y;
cin>>x>>y;
int fx = Find(x);
int fy = Find(y);
//根据题目要求输出
if(fx==fy&&Map[x][y]!=-1)
cout<<"No problem"<<endl;
if(fx==fy&&Map[x][y]==-1)
cout<<"OK but..."<<endl;
if(fx!=fy&&Map[x][y]!=-1)
cout<<"OK"<<endl;
if(fx!=fy&&Map[x][y]==-1)
cout<<"No way"<<endl;
}
return 0;
}
PTA 7-4 帅到没朋友
我们用一个vis数组作为标记数组,当朋友圈人数大于1时,我们将输入的数标记,如果朋友圈人数等于1说明朋友圈只有自己一人,我们不做标记
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>
using namespace std;
const int N = 100100;
int vis[N];//标记数组
int main()
{
int n,m,k,num;
memset(vis,0,sizeof(vis));//初始化
cin>>n;
while(n--)
{
cin>>k;
if(k>1)//朋友圈不止自己本人
{
for(int i=1; i<=k; i++)
{
cin>>num;
vis[num] = 1;
}
}
else//朋友圈只有自己一人或者没有朋友圈
cin>>num;
}
int sum = 0;
cin>>m;
for(int i=1; i<=m; i++)
{
cin>>num;
if(!vis[num])
{
vis[num] = 1;
if(sum)
cout<<" ";
printf("%05d",num);//注意是输出五位
sum++;
}
}
if(!sum)
cout<<"No one is handsome"<<endl;
return 0;
}
PTA 7-11 玩转二叉树
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>
using namespace std;
int str1[30],str2[30];
struct node
{
int data;
struct node *l;
struct node *r;
};
struct node *creat(int n,int *str1,int *str2)
{
if(n==0)
return NULL;
int i;
struct node *root;
root = (struct node*)malloc(sizeof(struct node));
root -> data = str1[0];
for(i=0; i<n; i++)
{
if(str2[i]==str1[0])
break;
}
root -> l = creat(i,str1+1,str2);
root -> r = creat(n-i-1,str1+i+1,str2+i+1);
return root;
};
void Swap(struct node *root)
{
struct node *p;
if(root!=NULL)
{
if(root->l!=NULL||root->r!=NULL)
{
p = root->r;
root->r = root->l;
root->l = p;
}
}
else
return ;
Swap(root->l);
Swap(root->r);
}
void ans(struct node *root)
{
struct node *s[55];
if(root)
{
int i=0,j=0;
s[j++]=root;
while(i<j)
{
if(s[i])
{
s[j++]=s[i] -> l;
s[j++]=s[i] -> r;
if(s[i]==root)
printf("%d",s[i]->data);
else
printf(" %d",s[i] -> data);
}
i++;
}
}
}
int main()
{
int n;
struct node *root;
cin>>n;
for(int i=0; i<n; i++)
cin>>str2[i];
for(int i=0; i<n; i++)
cin>>str1[i];
root = creat(n,str1,str2);
Swap(root);
ans(root);
return 0;
}