又把数据结构图论一章看了一遍,把一些算法写了写。包括:DFS、DFS(邻接链表)、BFS、PRIM、KRUSKAL、DIJSTRA。
以下是代码:
DFS( 邻接矩阵):
#include <stdio.h>
#include <stdlib.h>
#define maxn 1000
//аз╫с╬ьуС1
int mat[maxn][maxn],cnt;
bool vis[maxn];
void init_mat()
{ int n,m;
char s;
scanf("%d",&cnt);
for(int i=0;i<cnt;i++)
for(int j=0;j<cnt;j++)
{mat[i][j]=0;
vis[i]=false;}
for(;;){
scanf("%d%d",&n,&m);
if(n==-1&&m==-1)return;
mat[n][m]=1;
mat[m][n]=1;
}
}
void dfs(int pos)
{ printf("%d",pos);
vis[pos]=true;
for(int i=pos+1;i<cnt;i++)
if(mat[pos][i]&&!vis[i])
dfs(i);
}
int main()
{
int n;
init_mat();
dfs(0);
return 0;
}
DFS(邻接链表):
#include <stdio.h>
#include <stdlib.h>
#define maxn 1000
typedef struct node *node_pointer;
typedef struct node{
int vertex;
node_pointer link;
};
node_pointer graph[maxn];
bool vis[maxn];
void init_gra()
{
int cnt;
int n,m;
node_pointer temp1,temp2;
scanf("%d",&cnt);
for(int i=0;i<cnt;i++)
{ graph[i]=(node_pointer)malloc(sizeof(node));
graph[i]->link=NULL;
vis[i]=false;}
for(;;){
scanf("%d%d",&n,&m);
if(n==-1&&m==-1)break;
temp1=(node_pointer)malloc(sizeof(node));
temp1->vertex=m;
temp2=(node_pointer)malloc(sizeof(node));
temp2->vertex=n;
temp1->link=graph[n]->link;
graph[n]->link=temp1;
temp2->link=graph[m]->link;
graph[m]->link=temp2;
}
}
void dfs(int v)
{
node_pointer w;
printf("V%d",v);
vis[v]=true;
for(w=graph[v]->link;w;w=w->link)
if(!vis[w->vertex])
dfs(w->vertex);
}
int main()
{
init_gra();
dfs(0);
return 0;
}
BFS:
#include <stdio.h>
#include <stdlib.h>
#define maxn 1000
typedef struct node *node_pointer;
typedef struct node {
int vertex;
node_pointer link;
};
node_pointer front,rear,graph[maxn];
bool vis[maxn];
void addq(int v){
node_pointer tmp;
tmp=(node_pointer)malloc(sizeof(node));
tmp->vertex=v;
tmp->link=NULL;
if(front)
rear->link=tmp;
else
front=tmp;
rear=tmp;
}
int deleteq(){
node_pointer tmp;
int data;
tmp=front;
data=tmp->vertex;
//printf("%d",data);
front=tmp->link;
free(tmp);
return data;
}
void ini_mat(){
int cnt,n,m;
node_pointer tmp1,tmp2;
rear=front=NULL;
scanf("%d",&cnt);
for(int i=0;i<cnt;i++){
graph[i]=(node_pointer)malloc(sizeof(node));
graph[i]->link=NULL;
vis[i]=false;
}
while(1){
scanf("%d%d",&n,&m);
if(m==-1&&n==-1)break;
tmp1=(node_pointer)malloc(sizeof(node));
tmp1->vertex=m;
//tmp1->link=NULL;
tmp2=(node_pointer)malloc(sizeof(node));
tmp2->vertex=n;
//tmp2->vertex=NULL;
tmp1->link=graph[n]->link;
tmp2->link=graph[m]->link;
graph[n]->link=tmp1;
graph[m]->link=tmp2;
}
}
void bfs(int v){
node_pointer w;
printf("%5d",v);
addq(v);
vis[v]=true;
//if(!front)printf("what's the problem\n");
while(front){
v=deleteq();
// printf("%d\n",v);
for(w=graph[v]->link;w;w=w->link){
if(!vis[w->vertex]){
printf("%5d",w->vertex);
addq(w->vertex);
vis[w->vertex]=true;
}
// printf("hahah\n");
}
}
//printf("www\n");
}
int main()
{
ini_mat();
bfs(0);
return 0;
}
KRUSKAL:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#define maxn 1000
using namespace std;
typedef struct node{
int w;
int a,b;
}k;
bool cmp(const k& a,const k& b){
return a.w<b.w;
}
int father[maxn],rank[maxn];
void init_set(int n){
for(int i=0;i<n;i++){
father[i]=i;
rank[i]=0;
}
}
int find(int x){
if(father[x]!=x)
father[x]=find(father[x]);
return father[x];
}
bool union_set(int x,int y){
x=find(x);
y=find(y);
if(x==y)return false;
if(rank[x]>rank[y])
father[y]=x;
else
{ if(rank[x]==rank[y])
rank[y]++;
father[x]=y;
}
return true;
}
int main(){
int p,e,total,sum,flag;
k edge[maxn];
scanf("%d%d",&p,&e);
init_set(p);
total=0,sum=0,flag=0;
for(int i=0;i<e;i++)
scanf("%d %d %d",&edge[i].a,&edge[i].b,&edge[i].w);
sort(edge,edge+e,cmp);
//for(int i=0;i<e;i++)
//printf(" %d",edge[i].w);
for(int i=0;i<e;i++){
if(union_set(edge[i].a,edge[i].b)){
total++;
sum+=edge[i].w;
printf("%d->%d->",edge[i].a,edge[i].b);
}
if(total==p-1){
flag=1;
break;
}
}
if(flag)printf("the minum sum is%d\n",sum);
else printf("wrong data\n");
return 0;
}
Prim:
#include <stdio.h>
#include <string.h>
#define maxn 1000
#define inf 999999
int map[maxn][maxn],cost[maxn];
bool vis[maxn];
int numnode,sum;
void prim(){
int temp,k;
sum=0;
memset(vis,0,sizeof(vis));
vis[0]=true;
for(int i=0;i<numnode;i++)
cost[i]=map[0][i];
for(int i=0;i<numnode;i++){
temp=inf;
for(int j=0;j<numnode;j++)
if(!vis[j]&&temp>cost[j])
temp=cost[k=j];
if(temp==inf)break;
vis[k]=true;
sum+=temp;
for(int j=0;j<numnode;j++)
if(!vis[j]&&map[k][j]<cost[j])
cost[j]=map[k][j];
}
}
int main()
{
int edge,a,b,w;
scanf("%d%d",&numnode,&edge);
memset(map,inf,sizeof(map));
for(int i=0;i<edge;i++){
scanf("%d%d%d",&a,&b,&w);
map[a][b]=map[b][a]=w;
}
prim();
printf("%d\n",sum);
}
Dijstra:
#include <stdio.h>
#include <string.h>
#define maxn 1000
#define inf 99999
int map[maxn][maxn],distance[maxn];
bool vis[maxn];
int node,edge;
void dijstra(int v){
int k,tmp;
for(int i=0;i<node;i++){
distance[i]=map[v][i];
vis[i]=false;
}
tmp=inf;
vis[v]=true;
distance[v]=0;
for(int i=0;i<node;i++){
for(int j=0;j<node;j++)
if(!vis[j]&&distance[j]<tmp)
tmp=distance[k=j];
vis[k]=true;
for(int j=0;j<node;j++)
if(!vis[j])
if(distance[k]+map[k][j]<distance[j])
distance[j]=distance[k]+map[k][j];
}
}
int main()
{ int a,b,w;
int v;
scanf("%d%d",&node,&edge);
memset(map,inf,sizeof(map));
for(int i=0;i<edge;i++)
{
scanf("%d%d%d",&a,&b,&w);
map[a][b]=w;
}
scanf("%d",&v);
dijstra(v);
for(int i=0;i<node;i++)
printf("%d ",distance[i]);
return 0;
}