1.首先下载graphviz,并安装。
2.将输入的边保存起来。
3.将最短路径求出,并存储每个顶点的前驱。
4.在程序中将建边的代码写入一个dot文件中。
5.将dot文件转化为.png形式。
6.利用system函数打开.png。
代码如下:
#include
#include
#include
#include
#include
#include
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)
{
vectorRoad;
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;
}
运行结果: