利用graphviz来实现无向图可视化(求最短路径)

1.首先下载graphviz,并安装。

2.将输入的边保存起来。

3.将最短路径求出,并存储每个顶点的前驱。

4.在程序中将建边的代码写入一个dot文件中。

5.将dot文件转化为.png形式。

6.利用system函数打开.png。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
const int maxn = 1005;
const int INF = 0x3f3f3f3f;
int n, m;
int head[maxn];
int pre[maxn][maxn];
int d[maxn][maxn];
int vis[maxn][maxn];
FILE* fp;
struct edd
{
	int x, y, len, id;
};
struct edge
{
	int to;
	int next;
	int len;
};
edge e[maxn*maxn];
edd  a[maxn*maxn];
//添加边
void addedge(int x, int y, int len, int id)
{
	e[id].to = y;
	e[id].len = len;
	e[id].next = head[x];
	head[x] = id;
}
//单源最短路算法
void djst(int S)
{
	int vis[maxn];
	memset(vis, 0, sizeof(vis));
	for (int i = 1; i <= n; i++)
	{
		d[S][i] = INF;
	}
	d[S][S] = 0;
	while (1)
	{
		int Min = INF, u = -1;
		for (int i = 1; i <= n; i++)
		{
			if (!vis[i] && d[S][i] < Min)
			{
				Min = d[S][i];
				u = i;
			}
		}
		if (u == -1)
			break;
		vis[u] = 1;
		for (int i = head[u]; i != -1; i = e[i].next)
		{
			int v = e[i].to;
			int len = e[i].len;
			if (!vis[v] && d[S][v] > d[S][u] + len)
			{
				d[S][v] = d[S][u] + len;
				pre[S][v] = u;
			}
		}
	}
}
//建立无向图
void CreateGra()
{
	memset(vis, 0, sizeof(vis));
	memset(pre, -1, sizeof(pre));
	memset(head, -1, sizeof(head));
	fp = fopen("graph.dot", "w");
	fprintf(fp, "%s", "graph g { \n");
	printf("请输入城市的个数及道路的总数: ");
	scanf("%d %d", &n, &m);
	printf("请依次输入m条道路相连的两个城市及长度: ");
	for (int i = 0, id = 0; i < m; i++)
	{
		int x, y, len;
		scanf("%d%d%d", &x, &y, &len);
		//fprintf(fp, "%d  -- %d[label=%d];\n",x,y,len);
		a[i].x = x; a[i].y = y; a[i].len = len; a[i].id = i;
		addedge(x, y, len, id++);
		addedge(y, x, len, id++);
	}
	for (int i = 1; i <= n; i++)
	{
		djst(i);
	}
}
//寻找路径
void Findpath(int x, int y)
{
	vector<int>Road;
	int k = y;
	while (k != -1)
	{
		Road.push_back(k);
		fprintf(fp, "%d %s\n", k, "[style = \"filled\",color=\"blank\",fillcolor=\"chartreuse\"];");
		k = pre[x][k];
	}
	int Size = Road.size();
	for (int j = Size - 1; j > 0; j--)
	{
		int len;
		for (int i = head[Road[j]]; i != -1; i = e[i].next)
		{
			if (e[i].to ==Road[j - 1])
			{
				len = e[i].len;
				break;
			}
		}
		fprintf(fp, "%d -- %d[color=\"red\",label=%d];\n", Road[j], Road[j - 1], len);
		vis[Road[j]][Road[j - 1]] = 1;
		vis[Road[j - 1]][Road[j]] = 1;
		printf(" %d", Road[j]);
	}
	for (int i = 0; i < m; i++)
	{
		if (!vis[a[i].x][a[i].y])
		{
			fprintf(fp, "%d  -- %d[label=%d];\n", a[i].x, a[i].y, a[i].len);
		}
	}
	fprintf(fp, "}");
	fclose(fp);
}
//查询两个顶点的最短路径
void query()
{
	printf("请输入想要查询的两个顶点之间的最短路线:\n");
	int m, n;
Flag:scanf("%d%d", &m, &n);
	if (m == n)
	{
		printf("您输入的是同一座城市,请重新输入\n");
		goto Flag;
	}
	else if (d[m][n] == INF)
	{
		printf("两条道路之间没有通路\n");
		return;
	}
	else
	{
		Findpath(m, n);
	}
	system("dot -Tpng graph.dot -o Graph.png");
	system("Start C:\\Users\\asus\\Desktop\\datastructvs\\findjst\\findjst\\findjst\\Graph.png");
}
int main()
{

	CreateGra();
	query();
	system("pause");
	return 0;
}

 运行结果:

猜你喜欢

转载自blog.csdn.net/qq_41410799/article/details/84995663
今日推荐