很显然只是最短路径问题,地杰斯特拉算法 和 弗洛伊德算法都可以,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;
}