hdu1874

很显然只是最短路径问题,地杰斯特拉算法 和 弗洛伊德算法都可以,10分钟搞定代码 再次在一个细节处理上栽了,以后审题一定要细心,多花点时间琢磨题目中的陷阱,写好代码就很难检查了,1小时都没发现,注意这里两点之间,分清题目是说两点之间的开销预算(一般唯一)还是 之间的道路长度 ,这里两点之间可能存在多条道路,注意取最短的一条(初次筛选)

 

#include <iostream>
#define MAX 100000000
using namespace std;

int map[200][200];
int dist[200],tag[200];


int least_length(int v1,int v2,int n)
{
 memset(dist,MAX,sizeof(dist));
 memset(tag,0,sizeof(tag));
 dist[v1]=0,tag[v1]=1;
 for (int i=0;i<n;i++)
 dist[i]=map[v1][i];
 for (i=1;i<n;i++)
 {
  int minpos,min=MAX;
  for(int j=0;j<n;j++)
   if(dist[j]<min&&!tag[j])minpos=j,min=dist[j];
  
  tag[minpos]=1;
  for(j=0;j<n;j++)
   if(dist[minpos]+map[minpos][j]<dist[j]&&!tag[j])
    dist[j]=dist[minpos]+map[minpos][j];
 }
 return dist[v2];
}
int main()
{
 int n,m;
 while(cin>>n>>m)
 {
  for (int i=0;i<200;i++)
   for(int j=0;j<200;j++)
    map[i][j]=MAX;
  for(i=0;i<200;i++)map[i][i]=0;
  int from,to,length;
  while(m--)
  {
   cin>>from>>to>>length;
   if(length<map[from][to])
    map[from][to]=length,map[to][from]=length;
  }
  cin>>from>>to;
  least_length(from,to,n);
  if(dist[to]==MAX)cout<<-1<<endl;
  else cout<<dist[to]<<endl;
 }
 return 0;
}

 

 

 

 

 

 

佛洛依德算法:

#include <iostream>
#define MAX 100000000
using namespace std;
int map[200][200];


void floyd(int n)
{   
    int a,b,c;
    for(c=0;c<n;c++)
        for(a=0;a<n;a++)
            for(b=0;b<n;b++)
                if(map[a][c]+map[c][b]<map[a][b])
                    map[a][b]=map[a][c]+map[c][b];
}
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        for (int i=0;i<200;i++)
            for(int j=0;j<200;j++)
                map[i][j]=MAX;
   for(i=0;i<200;i++)map[i][i]=0;
   int from,to,length;
   while(m--)
   {
    cin>>from>>to>>length;
    if(length<map[from][to])
     map[from][to]=length,map[to][from]=length;
   }
   floyd(n);
   cin>>from>>to;
   if(map[from][to]==MAX)cout<<-1<<endl;
   else cout<<map[from][to]<<endl;
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值