http://acm.hdu.edu.cn/showproblem.php?pid=1879
#include<stdio.h>
#include<string>
#define MAX 0x3fffffff
int map[101][101],dis[101],vis[101];
int main()
{
int n;
freopen("a.txt","r",stdin);
while(scanf("%d",&n)&&n)
{
int i,j,k;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
map[i][j]=MAX;
int m=n*(n-1)/2;
for(i=0;i<m;i++)//构造邻接矩阵
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(d)
map[a][b]=map[b][a]=0;
else
map[a][b]=map[b][a]=c;
}
int sum=0;
for(i=1;i<=n;i++)
{
dis[i]=map[1][i];
}
memset(vis,0,sizeof(vis));
vis[1]=1;
for(i=1;i<n;i++)//n-1次迭代!!!!因为n个点有n-1条边!!!!!!!!!!
{
int min=MAX;
for(j=1;j<=n;j++)
{
if(!vis[j] && dis[j]<min)
{
min=dis[j];
k=j; //记下最小的点
}
}
vis[k]=1;//为1表示该节点权值已经是最小,为0是还不确定,应继续更新
sum+=dis[k];
for(j=1;j<=n;j++)
{
if(!vis[j] && dis[j]>map[k][j])//注意k,j相接!
dis[j]=map[k][j];
}
}
printf("%d/n",sum);
}
return 0;
}
本文介绍了一个使用C语言实现的最短路径算法案例,通过构建邻接矩阵并采用贪心策略来寻找图中各顶点到指定起始点的最短路径。此算法适用于解决小型图的最短路径问题。
3754

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



