ACM 实验室2020.10.03天梯赛练习*1
7-9 排座位
并查集,做的时候忘记考虑全联通了。。。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=1e5+10; int n,r,q,x,y,z;; int a[107][107],f[107]; int find(int x){ if(x==f[x]) return x; return f[x]=find(f[x]); } void he(int x,int y){ int t1=find(x); int t2=find(y); if(t1!=t2) f[t1]=t2; } int main(){ cin>>n>>r>>q; for(int i=1;i<=n;i++) f[i]=i; for(int i =1;i<=r;i++){ cin>>x>>y>>z; a[x][y]=z; a[y][x]=z; if(z==1){ he(x,y); } } while(q--){ cin>>x>>y; if(a[x][y]==1) puts("No problem"); else if(a[x][y]==-1){ if(find(x)==find(y)) puts("OK but..."); else puts("No way"); } else{ if(find(x)==find(y)) puts("No problem"); else puts("OK"); } } return 0; }
7-11 重排链表
注意奇偶和排列的方式。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=1e5+10; struct Node{ int ad,data,next; }N[MAXN]; int main(){ int a,n; vector <Node> L; cin>>a>>n; for(int i =1;i<=n;i++){ int in,x,y; cin>>x>>in>>y; N[x].ad=x;N[x].data=in;N[x].next=y; } while(a!=-1){ L.push_back(N[a]); a=N[a].next; } int m=L.size(); for(int i =0;i<m/2;i++){ printf("%05d %d %05d\n",L[m-i-1].ad,L[m-i-1].data,L[i].ad); if(i==m/2-1&&m%2==0) printf("%05d %d -1\n",L[i].ad,L[i].data); else printf("%05d %d %05d\n",L[i].ad,L[i].data,L[m-i-2].ad); } if(m%2) printf("%05d %d -1\n",L[m/2].ad,L[m/2].data); return 0; }
7-12 分而治之 (25分)
第一次没看懂,看了别人的解析才看懂。。。原来不是很难,主要就是攻下判断是不是都是独立
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=1e5+10; int n,m,x,y,aa[MAXN],a[MAXN]; void check(){ for(int i =1;i<=n;i++){ if(a[i]>0){ cout<<"NO"<<endl; return ; } } cout<<"YES"<<endl; } int main(){ cin>>n>>m; vector<vector<int> > v(n+1); while(m--){ cin>>x>>y; aa[x]++;aa[y]++; v[x].push_back(y); v[y].push_back(x); } int t; cin>>t; while(t--){ int l,xx; cin>>l; for(int i =1;i<=n;i++) a[i]=aa[i]; while(l--){ cin>>xx; a[xx]=0; for(int i =0;i<v[xx].size();i++) a[v[xx][i]]--; } check(); } return 0; }

浙公网安备 33010602011771号