1.
P1636
代码:
找规律。。。。
#include<bits/stdc++.h>
using namespace std;
int n,m;
int cnt[100000],ans=0;
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
cnt[a]++;
cnt[b]++;
}
for(int i=1;i<=n;i++){
//cout<<"cnt["<<i<<"]="<<cnt[i]<<endl;
if(cnt[i]%2==1){
ans++;
}
}
cout<<(ans==0?1:(ans/2));
return 0;
}
2.
P8654
并查集
代码:
#include<bits/stdc++.h>usingnamespacestd;
int fa[1010*1010],n,m,T,book[1010*1010],cnt[1010*1010],ans=0;
intfind(int x){
return (x==fa[x]?x:find(fa[x]));
}
intmain(){
cin>>n>>m;
cin>>T;
for(int i=1;i<=n*m;i++)fa[i]=i;
while(T--){
int a,b;
cin>>a>>b;
book[a]=1;
book[b]=1;
int fx=find(a);
int fy=find(b);
if(fx!=fy){
fa[fx]=fy;
}
fa[a]=find(fx);
fa[b]=fy;
}
for(int i=1;i<=n*m;i++){
if(1){
if(cnt[find(i)]==0){
ans++;
cnt[find(i)]++;
}
}
}
cout<<ans;
return0;
}
3.
P3958
依然是并查集
#include<bits/stdc++.h>
using namespace std;
long long T;
long long n;
long long r,h;
long long fa[1010];
long long x[1010],y[1010],z[1010];
long long ju(long long x1,long long y1,long long z1,long long x2,long long y2,long long z2){
return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2);
}
long long find(long long x){
return (x==fa[x]?x:find(fa[x]));
}
void lian(long long a,long long b){
long long fx=find(a);
long long fy=find(b);
if(fx!=fy){
fa[fx]=fy;
}
fa[a]=fy;
fa[b]=fy;
}
int main(){
cin>>T;
while(T--){
cin>>n>>h>>r;
for(long long i=0;i<=n+1;i++)fa[i]=i;
for(long long i=1;i<=n;i++){
cin>>x[i]>>y[i]>>z[i];
}
for(long long i=1;i<=n;i++){
for(long long j=i+1;j<=n;j++){
if(ju(x[i],y[i],z[i],x[j],y[j],z[j])<=4*r*r)lian(i,j);
}
if(z[i]<=r)lian(i,0);
if(z[i]+r>=h)lian(i,n+1);
}
cout<<(fa[0]==fa[n+1]?"Yes":"No")<<endl;
}
return 0;
}
4.
P1119
Floyed板子题
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int inf=114514114;
struct EVA{
int val;
int id;
}t[1000];
int dis[210][210];
int shi[210];
bool cmp(EVA a,EVA b){
return a.val<b.val;
}
void P(){
cout<<endl<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<dis[i][j]<<" ";
}
cout<<endl;
}
cout<<endl<<endl;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>t[i].val,t[i].id=i,shi[i]=t[i].val;
sort(t+1,t+n+1,cmp);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j)dis[i][j]=0;
else dis[i][j]=inf;
}
}
//P();
for(int i=1;i<=m;i++){
int a,b,c;
cin>>a>>b>>c;
dis[a+1][b+1]=c;
dis[b+1][a+1]=c;
}
//P();
int T,cnt=1;
cin>>T;
while(T--){
int a,b,c;
cin>>a>>b>>c;a++,b++;
while(c>=shi[cnt] && cnt<=n){
//P();
int v=cnt;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dis[i][j]>dis[i][v]+dis[j][v]){
dis[i][j]=dis[j][i]=dis[i][v]+dis[j][v];
}
}
}
cnt++;
}
if(shi[a]>c || shi[b]>c)cout<<"-1"<<endl;
else if(dis[a][b]==inf)cout<<"-1"<<endl;
else cout<<dis[a][b]<<endl;
}
return 0;
}
5.
P2504
最小生成树,就是证明有点麻烦
代码:
#include<bits/stdc++.h>
using namespace std;
int n,M[100000],m,x1[100000],Y[100000];
struct EVA{
int a,b;
double val;
}tree[1000000];
int cnt=0;
bool cmp(EVA A,EVA B){
return A.val<B.val;
}
int fa[1000000];
int find(int x){
return x==fa[x]?x:find(fa[x]);
}
double maxx=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>M[i];
cin>>m;
for(int i=1;i<=m;i++){
cin>>x1[i]>>Y[i];
}
for(int i=1;i<=m;i++){
for(int j=i+1;j<=m;j++){
tree[++cnt].a=i;
tree[cnt].b=j;
tree[cnt].val=sqrt(pow(x1[i]-x1[j],2)+pow(Y[i]-Y[j],2));
}
}
sort(tree+1,tree+cnt+1,cmp);
for(int i=1;i<=m;i++)fa[i]=i;
for(int i=1;i<=cnt;i++){
int x=tree[i].a;
int y=tree[i].b;
int fx=find(x);
int fy=find(y);
if(fx!=fy){
maxx=tree[i].val;
fa[fx]=fy;
fa[x]=fy;
fa[y]=fy;
}
}
int ans=0;
for(int i=1;i<=n;i++)if(M[i]>=maxx)ans++;
cout<<ans;
return 0;
}