📄 路由算法2.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include <iostream.h>
#define INFINITY 1000 /*最大距离*/
#define MAXNODES 100 /*最大节点数*/
struct state
{
int predecessor; /*前驱节点*/
int length; /*到起始点的距离*/
int label;
}state[MAXNODES];
void main()
{
int path[MAXNODES];
int dist[MAXNODES][MAXNODES];
int n;
int i,j,k,m,s,t,min,z;
int a[MAXNODES];
char c;
struct state * p;
printf("输入路由器的个数 :");
scanf("%d",&n);
printf("\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i!=j)
dist[i][j]=100;
if(i==j)
dist[i][j]=0;
}
}
for(i=0;i<n;i++)
{
printf("输入与路由器%d的相邻路由器数:",i);
scanf("%d",&k);
fflush(stdin);
printf("请分别输入路由器名称(以空格间隔,以回车结尾)\n");
j=0;
c=getchar();
while(c!='\n')
{
if(j%2==0)
a[j]=(int)(c-'0');
if(j%2==1)
a[j]=c;
j++;
c=getchar();
}
for(m=0;m<k;m++)
{
if(dist[a[2*m]][i]>15)
dist[i][a[2*m]]=dist[a[2*m]][i]=(rand()%10+2);
else
dist[i][a[2*m]]=dist[a[2*m]][i];
}
printf("\n");
printf("与路由器%d相邻的路由器距离为:\n",i);
for(m=0;m<k;m++)
{
printf("与路由器%d的距离为:%2d\n",a[2*m],dist[i][a[2*m]]);
}
printf("\n");
}
printf("结束初始化!\n");
printf("\n");
z=1;
while(z==1){
printf("请选择发送站点:");
scanf("%d",&s);
printf("请选择接受站点:");
scanf("%d",&t);
for(p=&state[0]; p<&state[n]; p++)
{
p->predecessor = 1;
p->length = INFINITY;
p->label =2;
}
state[t].length = 0;
state[t].label = 1;
k = t; /*k是当前工作站点*/
do
{
for(i=0; i<n; i++)
{
if(dist[k][i]!=0 && state[i].label==2)
{
if(state[k].length+dist[k][i]<state[i].length)
{
state[i].length = state[k].length+dist[k][i];
state[i].predecessor = k;
}
}
}
k=0;
min=INFINITY;
for(i=0; i<n; i++)
{
if(state[i].label==2&& state[i].length<min)
{
k=i;
min=state[i].length;
}
}
state[k].label =1;
}while(k!=s);
i=0;
k=s;
do
{
path[i++] = k;
k = state[k].predecessor;
}while(k!=t);
printf("ok2\n");
for(j=0;j<i;j++)
{
printf("%d->",path[j]);
}
printf("\n1.继续 2.退出\n");
scanf("%d",&z);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -