poj1502(dijsktra)

找第一个点到其他所有点的最短距离,因为是并行的,所以取最大的那个。
就是上一篇dijsktra改一下输入。

#include<iostream>
#include<algorithm>
#define maxn 100
using namespace std;
int edge[maxn][maxn];//邻接矩阵
int vis[maxn];//标记数组,如果这个点相邻边已经被松弛过,标记为1,下次遍历到的时候跳过
int dis[maxn];//存储1到i这个点现在的距离

void init(int n)
{
 for(int i=1;i<=n;i++)
 {
  for(int j=1;j<=n;j++)
  {
   if(i==j)
   edge[i][j]=0;
   else
   edge[i][j]=1e9;
  }
 }
}

void dijkstra(int n)
{
 memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++)
  dis[i]=edge[1][i];
 //找到现在距离1最近的点,一共要找n-1次
 for(int i=2;i<=n;i++)
 {
  int minn=1e9;
  int pos=-1;
  for(int j=2;j<=n;j++)
  {
   if(vis[j]==1) continue;//松弛过
   if(minn>dis[j])
   {
    pos=j;
    minn=dis[j];
   }
  }
  //标记
  vis[pos]=1;
     //松弛操作
  for(int j=2;j<=n;j++)
  {
   if(j==pos) continue;
   if(edge[pos][j]!=1e9)//这条边存在
   {
   dis[j]=min(dis[j],dis[pos]+edge[pos][j]);
   }
  }
 }
}
int main()
{
 int num;
 cin>>num;//几个点
 init(num);
 //输入边的邻接矩阵
 for(int i=1;i<=num;i++)
  for(int j=1;j<i;j++)
  {
   char s[10];
   scanf("%s",s);
   if(s[0]!='x')
   edge[i][j]=edge[j][i]=atoi(s); 
  }
 dijkstra(num);
 int ans=-1;
 for(int i=2;i<=num;i++)
 {
  ans=max(ans,dis[i]);
 }
 cout<<ans<<endl;
}
发布了16 篇原创文章 · 获赞 1 · 访问量 274

猜你喜欢

转载自blog.csdn.net/weixin_44254608/article/details/104613044