刷并查集的题(4h)
我先学的二叉树再学的并查集,结果二叉树动弹不得,并查集快写完了
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int find(int x);
void merge(int i,int j);
int fa[200000];
int n,m;
int road[200000][3];
void fast(int left,int right);
int main()
{
scanf("%d %d",&n,&m);
int i,nx=n,t;
for(i=1;i<=m;i++){
scanf("%d %d %d",&road[i][0],&road[i][1],&road[i][2]);
fa[i]=i;
}
if(n-1>m)
printf("-1");
else {
fast(1,m);
for(i=1;i<=m;i++)
{
if( find(road[i][0])!=find(road[i][1]) )
{
merge(road[i][0],road[i][1]);
nx--;
}
if(nx==1)
{
t=road[i][2];
printf("%d",t);
break;
}
}
if(nx>1)printf("-1");
}
return 0;
}
int find(int x)
{
if(fa[x]==x)
return x;
else {
fa[x]=find(fa[x]);
return fa[x];
}
}
void merge(int i,int j)
{
fa[find(i)]=find(j);
}
void fast(int left,int right)
{
int t,l=left,j=right,x=road[left][2];
if(l>j)
return ;
while(l<j)
{
while(l<j&&road[j][2]>=x)j--;
while(l<j&&road[l][2]<=x)l++;
if(l<j)
{
t=road[l][2],road[l][2]=road[j][2],road[j][2]=t;
t=road[l][1],road[l][1]=road[j][1],road[j][1]=t;
t=road[l][0],road[l][0]=road[j][0],road[j][0]=t;
}
}
x=road[left][2],road[left][2]=road[l][2],road[l][2]=x;
x=road[left][1],road[left][1]=road[l][1],road[l][1]=x;
x=road[left][0],road[left][0]=road[l][0],road[l][0]=x;
fast(left,l-1);
fast(l+1,right);
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int n,m,q;
int v[20000],w[20000],f[20000];
int fa[20000];
int find(int x);
void merge(int i,int j);
int max(int x,int y);
int main()
{
scanf("%d %d %d",&n,&m,&q);
int i,j;
for(i=1;i<=n;i++)
{
scanf("%d %d",&v[i],&w[i]);
fa[i]=i;
}
int x,y;
for(i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
v[find(y)]=v[find(y)]+v[find(x)];
w[find(y)]=w[find(y)]+w[find(x)];
v[find(x)]=0;w[find(x)]=0;
merge(x,y);
}
for(i=1;i<=n;i++)
{
for(j=q;j>=v[i];j--)
{
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
printf("%d",f[q]);
return 0;
}
int find(int x)
{
if(fa[x]==x)
return x;
else
{
fa[x]=find(fa[x]);
return fa[x];
}
}
void merge(int i,int j)
{
fa[find(i)]=find(j);
}
int max(int x,int y)
{
if(x>y)return x;
else return y;
}
再战二叉树(5h)
二叉树这玩意真是,学个概念花了一天,把概念整明白又整了一天,把代码敲出来又是一天,三天过去了啊,还是动弹不得。我把二叉树建立出来了,完事先序,中序,后序遍历都试了一遍,然后准备去做题,好家伙,根本不知道怎么做。搞了老半天只搞出来了一道看起来最简单的,而且还没用上我好不容易敲出来的二叉树的几个遍历。折磨~
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void dfs(int st,int fn,int ss,int nn);
char zhong[10];
char hou[10];
int n;
int kk=0;
int main()
{
scanf("%s",zhong);
scanf("%s",hou);
n=strlen(hou);
dfs(0,n-1,0,n-1);
return 0;
}
void dfs(int st,int fn,int ss,int nn)
{
if(st>fn)return ;
printf("%c",hou[fn]);
int p=ss;
while(zhong[p]!=hou[fn])
p++;
dfs(st,p-ss+st-1,ss,p-1);
dfs(p-ss+st,fn-1,p+1,nn);
}
总计9h
明日计划
二叉树二叉树二叉树!!