数据结构----图论基础算法的小合集(1)

又把数据结构图论一章看了一遍,把一些算法写了写。包括: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;
}



 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值