数据结构——树小结代码

来源:互联网 发布:淘宝查假冒伪劣处罚 编辑:程序博客网 时间:2024/06/05 18:28
//for UDG
#include<stdio.h>
#include<string.h>
#define MAX 100
#define INFINITE 32767
int visited[MAX];
struct node{
    int vertex,adjs;
    char data[MAX][20];
    int nodes[MAX];
    int edges[MAX][MAX];
}roads;
void init01(struct node *g){
    int i,j;
    for(i=0;i<g->vertex;i++){
        g->nodes[i]=i;
        visited[i]=0;
        for(j=i;j<g->vertex;j++)
            g->edges[i][j]=g->edges[j][i]=INFINITE;
    }
}
void dfs01(struct node g,int start)
{
    int i=0;
    visited[start]=1;
    printf("%d  ",g.nodes[start]);
    for(i=0;i<g.vertex;i++)
        if(!visited[i]&&g.edges[start][i]==1)
            dfs01(g,i);
}
//use queue to implements it
void bfs(struct node g,int start){
    int queue[MAX],front,rear,i,temp;
    front = rear = 0;
    queue[front++] = start;
    while(front != rear){
        temp=queue[rear++%MAX];
        visited[temp]=1;
        printf("%d ",g.nodes[temp]);
        for(i=0;i<g.vertex;i++)
            if(!visited[i]&&g.edges[temp][i]==1)
                queue[front++%MAX]=i;
    }
}
void MST(struct node g){
    int i,j,sum=0,min,k,start=0;
    int track[MAX],lowcost[MAX];
    for(i=0;i<MAX;i++){
        lowcost[i]= g.edges[start][i];
        track[i] = start;
    }
    visited[start] = 1;
    for(i=0;i<g.vertex-1;i++){
        min = INFINITE;
        //find the next edge
        for(j=0;j<g.vertex;j++)
            if(!visited[j]&& lowcost[j]<min){
                min=lowcost[j];
                k=j;
            }
        if(min == INFINITE)break;
        visited[k]=1;
        printf("%d --> %d\n",track[k],k);
        sum+=lowcost[k];
        for(j=0;j<g.vertex;j++)
            if(!visited[j]&&lowcost[j]>g.edges[k][j]){
                lowcost[j] = g.edges[k][j];
                track[j] = k;
            }
    }
    printf("Total cost: %d",sum);
}

void Dijkstra(struct node g,int start,int end){
    int cost[MAX],track[MAX],i,j;
    int min,k;
    for(i=0;i<g.vertex;i++){
        cost[i] = INFINITE;
    }
    cost[start]=0;
    for(i=0;i<g.vertex;i++){
        min = INFINITE;
        for(j=0;j<g.vertex;j++)
            if(!visited[j]&&cost[j]<min){
                min = cost[j];
                k = j;
            }
        if(min == INFINITE)break;
        visited[k] = 1;
        for(j=0;j<g.vertex;j++)
            if(!visited[j]&&cost[j]>g.edges[k][j]+cost[k]){
                cost[j] = g.edges[k][j]+cost[k];
                track[j] = k;
            }
    }
    printf("Least cost form %s to %s is: %d\nThe path is below:\n",g.data[start],g.data[end],cost[end]);
    printf("%s",g.data[end]);
    end = track[end];
    while(end != start){
        printf("-->%s",g.data[end]);
        end = track[end];
    }
    printf("-->%s",g.data[start]);
}
int main()
{
    int start,i,a,b;

    //dfs
/*    scanf("%d%d%d",&roads.vertex,&roads.adjs,&start);
    init01(&roads);
    for(i=0;i<roads.adjs;i++){
        scanf("%d%d",&a,&b);
        roads.edges[a][b]=roads.edges[b][a]=1;
    }
*/
    //bfs
    /*scanf("%d%d%d",&roads.vertex,&roads.adjs,&start);
    init01(&roads);
    for(i=0;i<roads.adjs;i++){
        scanf("%d%d",&a,&b);
        roads.edges[a][b]=1;
    }*/

    //MST Prime
/*    scanf("%d%d",&roads.vertex,&roads.adjs);
    init01(&roads);
    for(i=0;i<roads.adjs;i++){
        scanf("%d%d%d",&a,&b,&start);
        roads.edges[a][b]=roads.edges[b][a]=start;
    }
    MST(roads);*/

    //Dijkstra
    int c,end;
    scanf("%d%d%d%d",&roads.vertex,&roads.adjs,&start,&end);
    init01(&roads);
    getchar();
    for(i=0;i<roads.vertex;i++)
        scanf("%s",roads.data[i]);
    for(i=0;i<roads.adjs;i++){
        scanf("%d%d%d",&a,&b,&c);
        roads.edges[a][b]=c;
    }
    Dijkstra(roads,start,end);
    return 0;
}
//test data file
//--------------------无向图-------------------
/*
 *
8 9 0
0 1
1 3
1 4
3 7
3 4
0 2
2 5
2 6
5 6
*
*/
//-------------------有向无环图----------------
/*
 *
7 10 4
0 1
0 2
1 2
1 3
2 3
4 6
6 0
4 5
5 6
5 3
 *
 * */
//----------------- 单源最短路径-----------------
/*
 *
8 11 4 0
Los_Angeles Francisco Denver Chicago Boston New_York Miami New_Orleans
4 5 250
4 3 1500
5 3 1000
5 7 1400
5 6 900
6 7 1000
3 2 1200
2 1 800
2 0 1000
1 0 300
7 0 1700
*
*/