数据结构——树小结代码
来源:互联网 发布:淘宝查假冒伪劣处罚 编辑:程序博客网 时间: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
*
*/
#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
*
*/
- 数据结构——树小结代码
- 数据结构—递归小结
- 数据结构—栈小结
- 数据结构—队列小结
- 数据结构—基本树的操作小结
- 数据结构绪论——小结
- 数据结构小结——链表
- 数据结构—分治法小结
- Deancoding<一>——数据结构学习小结
- 数据结构(期末小结)——开始
- 数据结构小结——顺序栈
- 数据结构小结——链式栈
- 数据结构小结——顺序队列
- 数据结构—链表的操作小结
- [数据结构-划分树小结]
- 数据结构(期末小结)——1、数据结构概论
- 数据结构——停车场代码
- 数据结构入门小结之树
- js通过Class Name获取一个对象的数组
- xen体系结构
- 【转载】Lua 脚本语法说明
- Linux驱动调试的Debugfs的使用简介
- 使用XmlPull解析XML
- 数据结构——树小结代码
- zoj 3631 Watashi's BG(搜索)
- mtk android lcm 打印log信息方法
- Sybase ASE v15.x中查询本月最后一天的日期的3种实现方法
- 虚拟设备和 Open Virtualization Format
- Combox 属性 dropdown 和droplist的区别
- 捕捉Ruby正则表达式用法精髓
- USB启动盘制作,WinPE、Puppy、Ubuntu
- sscanf详解(一)