数据结构实验之图论五:从起始点到目标点的最短步数(BFS)
注意何时输出问题;
找到1即放入了q[ ]中就输出step[1]并return ;
void bfs(int t)
{
int low=0,top=0,i;
v[t]=1;
q[top]=t;
top++;
while(low<top)
{
int x=q[low];
for(i=0;i<n;i++)
{
if(mp[x][i]==1&&v[i]==0)
{
v[i]=1;
q[top]=i;
top++;
step[i]=step[x]+1;
}
if(q[top-1]==1)
{
printf("%d\n",step[1]);
return ;
}
}
low++;
}
printf("NO\n");
}
数据结构实验之图论六:村村通公路
#define inf 99999999 //不连通状态;
int mp[1000][1000],v[1000],d[1000];
int sum;
void prim(int n)
{
sum=0; //最小生成树树权值和
int mm,tag,flag=0;
memset(v,0,sizeof(v));
for(int i=1;i<=n;i++)
{
d[i]=mp[1][i]; //从1开始生成树;
}
v[1]=1;
for(int i=1; i<n; i++) //n-1条边;
{
mm=inf;
for(int j=1; j<=n; j++)
{
if(v[j]!=1&&d[j]<mm) //选择未添加的路径注意v[j];
{
mm=d[j];
tag=j; //记录新加入的结点;
}
}
if(mm==inf) //有城市不连通;
{
flag=1;
break;
}
sum+=mm;
v[tag]=1;
for(int i=1;i<=n;i++) //更新d;
{
if(mp[tag][i]<d[i]&&v[i]!=1) //新加入结点和其他结点间距小于原来;
{
d[i]=mp[tag][i];
}
}
}
if(flag==1) printf("-1\n");
else printf("%d\n",sum);
}
int main()
{
int n,m,a,b,c;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
{
for(int j=1; j<=n; j++)
{
if(i==j) mp[i][j]=0; //自己为0;
else mp[i][j]=inf;
}
}
while(m--)
{
scanf("%d %d %d",&a,&b,&c);
if(mp[a][b]>c)
{
mp[a][b]=c;
mp[b][a]=c;
}
}
prim(n);
}
return 0;
}
数据结构实验之图论七:驴友计划
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define inf 99999999
int mp[500][500],v[500],d[500],money[500][500];
int i,j;
void f(int n,int s,int t)
{
int sum[500],mm,tag;
memset(v,0,sizeof(v));
v[s]=1;
for(i=0;i<n;i++)
{
d[i]=mp[s][i];
sum[i]=money[s][i];
}
for(i=0;i<n;i++)
{
mm=inf;
for(j=0;j<n;j++)
{
if(d[j]<mm&&v[j]!=1)
{
mm=d[j];
tag=j;
}
}
v[tag]=1;
for(j=0;j<n;j++)
{
if(mp[tag][j]<inf&&v[j]!=1)
{
if(mp[tag][j]+d[tag]<d[j])
{
d[j]=d[tag]+mp[tag][j];
sum[j]=sum[j]+money[tag][j];
}
else if(mp[tag][j]+d[tag]==d[j]&&money[tag][j]+sum[tag]<sum[j])
{
sum[j]=sum[j]+money[tag][j];
}
}
}
}
printf("%d %d\n",d[t],sum[t]);
}
int main()
{
int t,n,m,s,d,a,b,c,k;
scanf("%d",&t);
while(t--)
{
scanf("%d %d %d %d",&n,&m,&s,&d);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j) mp[i][j]=0;
else mp[i][j]=inf;
}
}
while(m--)
{
scanf("%d %d %d %d",&a,&b,&c,&k);
if(mp[a][b]>c)
{
mp[a][b]=mp[b][a]=c;
money[a][b]=money[b][a]=k;
}
}
f(n,s,d);
}
return 0;
}
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int mmp[520][520]; //建立邻接矩阵存储图
int val[520][520]; //花费
int length[520][520]; //任意两节点间总路程
int cost[520][520]; //任意两节点间总花费
int n, m, s, d;
void Folyd()
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
length[i][j] = mmp[i][j], cost[i][j] =val[i][j];
}
}
for(int k = 0; k < n; k++)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(i != j)
{
if(length[i][j] > length[i][k] + length[k][j])
{
length[i][j] = length[i][k] + length[k][j];
cost[i][j] = cost[i][k] + cost[k][j];
}
if(length[i][j] == length[i][k] + length[k][j])
{
if(cost[i][j] > cost[i][k] + cost[k][j])
cost[i][j] = cost[i][k] + cost[k][j];
}
}
}
}
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n>>m>>s>>d;
for(int i = 0; i <= n; i++)
{
for(int j = 0; j <= n; j++)
{
if(i == j)
mmp[i][j] =val[i][j] = 0;
else
mmp[i][j] =val[i][j] = INF;
}
}
for(int i = 0; i < m; i++)
{
int u, v, w,x;
cin>>u>>v>>w>>x;
mmp[u][v] = mmp[v][u] = w;
val[u][v] =val[v][u] =x;
}
Folyd();
cout<<length[s][d]<<" "<<cost[s][d]<<endl;
}
return 0;
}