//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
*
*/
本文介绍了一种使用C语言实现图的基本操作的方法,包括深度优先搜索(DFS)、广度优先搜索(BFS)、Prim最小生成树算法及Dijkstra最短路径算法。通过具体的代码示例展示了这些算法如何应用于解决实际问题。

被折叠的 条评论
为什么被折叠?



