hdu1874

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

 

#include
#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 dist[i]=map[v1][i];
 for (i=1;i {
  int minpos,min=MAX;
  for(int j=0;j   if(dist[j]  
  tag[minpos]=1;
  for(j=0;j   if(dist[minpos]+map[minpos][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]=length,map[to][from]=length;
  }
  cin>>from>>to;
  least_length(from,to,n);
  if(dist[to]==MAX)cout<<-1<  else cout< }
 return 0;
}

 

 

 

 

 

 

佛洛依德算法:

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


void floyd(int n)
{   
    int a,b,c;
    for(c=0;c        for(a=0;a            for(b=0;b                if(map[a][c]+map[c][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]=length,map[to][from]=length;
   }
   floyd(n);
   cin>>from>>to;
   if(map[from][to]==MAX)cout<<-1<   else cout<    }
    return 0;
}

你可能感兴趣的:(hdu1874)