POJ 1125 单源最短路 dijkstra的算法初步探索

本文深入探讨了如何利用迪杰斯特拉算法解决带有正权值有向边的最短路径问题,特别是面对不连通点的情况。详细介绍了算法实现过程中的关键步骤和技巧,包括初始化、更新距离以及处理不连通点的方法。通过实例代码展示了从读取输入图到应用算法、调试并输出最短路径的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//好久没有写对题了,心里有点慌,这题遇到了很大的障碍,
//debug了好久 还是太不熟悉了
//最短路
//边权为正,有向边
//可能会有不连通的点哦
//用dijkstra算法应该可行
//现在自己试试
//忘记返回函数的值了,还有把源点去掉
//这个复杂度是n三方的
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 1000+100
using namespace std;

const int maxn=100+10;
int w[maxn][maxn];//边的权值
int d[maxn];
bool vis[maxn];
int fa[maxn];
int n;
void read_graph(void)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
w[i][j]=INF;
memset(fa,0,sizeof(fa));
for(int i=1;i<=n;i++)//读入图
{
int m;//边的个数
int v,t;//边的一个端点和所耗费的时间
scanf("%d",&m);
for(int j=1;j<=m;j++)
{
scanf("%d %d",&v,&t);
w[i][v]=t;
}
}
/* for(int i=1;i<=n;i++)
// for(int j=1;j<=n;j++)
// printf("%d%c",w[i][j],j==n?'\n':' ');
*/
}
int dijkstra(int s)
{
//dijkstra
memset(vis,false,sizeof(vis));//初始化所有点都没有访问过

for(int i=1;i<=n;i++) d[i]=INF;//初始化距离
d[s]=0;

int ans=0;
for(int i=1;i<=n;i++)
{
int x,m=INF;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&m>=d[j]){m=d[j]; x=j; }

}
vis[x]=1;
for(int y=1;y<=n;y++)
{
if(d[y]>d[x]+w[x][y]) {d[y]=d[x]+w[x][y];fa[y]=x; }
}

}
for(int i=1;i<=n;i++) {if(i!=s) ans=max(ans,d[i]);}
return ans;
}
int main()
{

while(scanf("%d",&n)&&n!=0 )
{
int anss=0;
int ans=INF;
read_graph();
for(int i=1;i<=n;i++)
{
int temp=dijkstra(i);
if(temp<ans) { ans=temp;anss=i; }
}
if(ans==INF) printf("disjoint\n");
else printf("%d %d\n",anss,ans);

}
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值