二叉树的代码
在二叉树中删除最小数,再增加一个数。
#include <stdio.h>
int h[15]={1,2,5,12,7,17,25,19,36,99,22,28,46,92};
void swa(int x,int y)
{
int t=h[x];
h[x]=h[y];
h[y]=t;
}
void siftdown(int i)
{
int t,flag=0;
while(i*2<=n&&flag==0)
{
if(h[i]>h[i*2])
{
t=i*2;
}
else
{
t=i;
}
if(i*2+1<=n)
{
if(h[t]>h[i*2+1])
{
t=i*2+1;
}
}
if(t!=i)
{
swa(t,i);
i=t;
}
else
{
flag=1;
}
}
}
int main(void)
{
return 0;
}
增加一个数到堆中
void siftup(int i)
{
int flag=0;
if(i==1)
{
return ;
}
while(i!=1&&flag==0)
{
if(h[i]<h[i/2])
{
swa(i,i/2);
i=i/2;
}
}
}
并查集
#include<stdio.h>
int f[10000],n,m,k,sum;
void ini()
{
for(int i=1;i<=n;i++)
{
f[i]=i;
}
}
int getF(int v)
{
if(f[v]==v)
{
return v;
}
else
{
f[v]=getF(f[v]);
return f[v];
}
}
void merger(int v,int u)
{
int t1,t2;
t1=getF(v);
t2=getF(u);
if(t1!=t2)
{
f[t2]=t1;
}
}
int main()
{
int i,x,y;
scanf("%d%d",&n,&m);
ini();
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
merger(x,y);
}
for(i=1;i<=n;i++)
{
if(f[i]==i)
{
sum++;
}
}
printf("sum==%d",sum);
return 0;
}
字典树
#include <cstdio>
#include<cstdlib>
#define MAX 26
#define StartChar 'a'
using namespace std;
typedef struct TrieNode
{
int nCount;
bool ifend;
struct TrieNode * next[MAX];
}TrieNode;
TrieNode * CreateTrie()
{
TrieNode *p=(TrieNode *)malloc(sizeof(TrieNode));
p->nCount=1;
p->ifend=false;
for(int i=0;i<MAX;i++)
{
p->next[i]=NULL;
}
return p;
}
void InsertTrieNode(TrieNode * root,char *s)
{
if(!root)
{
root=CreateTrie();
}
TrieNode *p=root;
for(int i=0;s[i]!='\0';i++)
{
if(!p->next[s[i]-StartChar])
{
p->next[s[i]-StartChar]=CreateTrie();
}
else
{
p->next[s[i]-StartChar]->nCount++;
}
p=p->next[s[i]-StartChar];
}
p->ifend=true;
}
int SearchTrieNode(TrieNode *root,char *s)
{
if(!root)
{
return -1;
}
TrieNode *p=root;
for(int i=0;s[i]!='\0';i++)
{
if(!p->next[s[i]-StartChar])
{
return -2;
}
else
{
p=p->next[s[i]-StartChar];
}
}
printf("find \"%s\" %d times\n",s,p->nCount);
return p->nCount;
}
void del(TrieNode *root)
{
if(!root)
{
return ;
}
for(int i=0;i<MAX;i++)
{
if(root->next[i])
{
del(root->next[i]);
}
}
free(root);
}
int main()
{
TrieNode *tree=CreateTrie();
char s[100];
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",s);
InsertTrieNode(tree,s);
}
scanf("%s",s);
SearchTrieNode(tree,s);
del(tree);
getchar();
getchar();
return 0;
}
Kruskal 最小生成树
#include <cstdio>
/*
6 9
2 4 11
3 5 13
4 6 3
5 6 4
2 3 6
4 5 7
1 2 1
3 4 9
1 3 2
*/
typedef struct edge
{
int u,v,w;
}edge;
edge e[10];
int n,m;
int f[7]={0},sum=0,Count=0;
void print(int num)
{
for(int i=1;i<=num;i++)
{
printf("%d %d %d\n",e[i].u,e[i].v,e[i].w);
}
}
void quicksort(int left,int right)
{
if(left>right)
{
return ;
}
int zuo=left,you=right;
edge t;
while(zuo!=you)
{
while(e[you].w>=e[left].w&&zuo<you)
{
you--;
}
while(e[zuo].w<=e[left].w&&zuo<you)
{
zuo++;
}
if(zuo<you)
{
t=e[zuo];
e[zuo]=e[you];
e[you]=t;
}
}
t=e[left];
e[left]=e[zuo];
e[zuo]=t;
quicksort(left,zuo-1);
quicksort(zuo+1,right);
return ;
}
int getf(int v)
{
if(f[v]==v)
{
return v;
}
else
{
f[v]=getf(f[v]);
return f[v];
}
}
int Merge(int v,int u)
{
int t1,t2;
t1=getf(v);
t2=getf(u);
if(t1!=t2)
{
f[t2]=t1;
return 1;
}
return 0;
}
int main()
{
int i;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
}
//print(m);
printf("***\n");
quicksort(1,m);
//print(m);
for(int i=1;i<=n;i++)
{
f[i]=i;
}
for(int i=1;i<=m;i++)
{
if(Merge(e[i].u,e[i].v))
{
Count++;
sum+=e[i].w;
}
if(Count==n-1)
{
break;
}
}
printf("%d",sum);
getchar();
getchar();
return 0;
}
prim最小生成树
#include <cstdio>
#include <climits>
/*
6 9
2 4 11
3 5 13
4 6 3
5 6 4
2 3 6
4 5 7
1 2 1
3 4 9
1 3 2
*/
int main()
{
int n,m,i,j,k,mins,t1,t2,t3;
int e[7][7],dis[7],book[7]={0};
int inf=INT_MAX;
int Count=0,sum=0;
scanf("%d %d",&n,&m);//输入节点数,边数。
/* 读图 */
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j)
{
e[i][i]=0;
}
else
{
e[i][j]=inf;
}
}
}
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&t1,&t2,&t3);
e[t1][t2]=t3;
e[t2][t1]=t3;
}
/* 初始化 */
for(i=1;i<=n;i++)
{
book[i]=0;
dis[i]=e[1][i];
}
book[1]=1;// 第一个顶尖,已经加入最小树。
Count++;
while(Count<n)
{
mins=inf;
for(i=1;i<=n;i++)
{
if(book[i]==0&&dis[i]<mins)
{
mins=dis[i];j=i;
}
}
book[j]=1;Count++;sum+=dis[j];
//printf("%3d节点入树 总长%3d\n",j,sum);
for(k=1;k<=n;k++)
{
if(book[k]==0&&dis[k]>e[j][k])
{
dis[k]=e[j][k];
}
}
}
printf("%d",sum);
getchar();
getchar();
return 0;
}
prim堆优化
#include <cstdio>
#include <climits>
/*
6 9
2 4 11
3 5 13
4 6 3
5 6 4
2 3 6
4 5 7
1 2 1
3 4 9
1 3 2
*/
int dis[7],book[7]={0};
int h[7],pos[7],Size;
void swift(int x,int y)
{
int t=h[x];
h[x]=h[y];
h[y]=t;
t=pos[h[x]];
pos[h[x]]=pos[h[y]];
pos[h[y]]=t;
return ;
}
void siftdown(int i)
{
int t,flag=0;
while(i*2<=Size&&flag==0)
{
if(dis[h[i]]>dis[h[i*2]])
{
t=i*2;
}
else
{
t=i;
}
if(i*2+1<=Size)
{
if(dis[h[i]]>dis[h[2*i+1]])
{
t=i*2+1;
}
}
if(t!=i)
{
swift(t,i);
}
else
{
flag=1;
}
}
return ;
}
void siftup(int i)
{
int flag=0;
if(i==1)
{
return ;
}
while(i!=1&&flag==0)
{
if(dis[h[i]]<dis[h[i/2]])
{
swift(i,i/2);
i=i/2;
}
else
{
flag=1;
}
}
return ;
}
int pop()
{
int t=h[1];
pos[t]=0;
h[1]=h[Size];
pos[h[1]]=1;
Size--;
siftdown(1);
return t;
}
int main()
{
int n,m,i,j,k;
int u[19],v[19],w[19],first[7],Next[19];
int inf=INT_MAX;
int Count=0,sum=0;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
first[i]=-1;
}
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&u[i],&v[i],&w[i]);
Next[i]=first[u[i]];
first[u[i]]=i;
}
for(i=m+1;i<=2*m;i++)
{
u[i]=v[i-m];
v[i]=u[i-m];
w[i]=w[i-m];
Next[i]=first[u[i]];
first[u[i]]=i;
}
/* prim 算法 */
book[1]=1;
Count++;
dis[1]=0;
for(i=2;i<=n;i++)
{
dis[i]=inf;
}
k=first[1];
while(k!=-1)
{
dis[v[k]]=w[k];
k=Next[k];
}
Size=n;//堆大小为 n
for(i=1;i<=Size;i++)
{
h[i]=i;
pos[i]=i;
}
for(i=Size/2;i>=1;i--)
{
siftdown(i);
}
pop();//第一个元素已经在最下树中。先弹去。
while(Count<n)
{
j=pop();
book[j]=1;Count++;sum+=dis[j];
k=first[j];
while(k!=-1)
{
if(book[v[k]]==0&&dis[v[k]]>w[k])
{
dis[v[k]]=w[k];
siftup(pos[v[k]]);
}
k=Next[k];
}
}
printf("%d",sum);
getchar();
getchar();
return 0;
}