第三道最短路题目
初始化的失误导致我WA 若干次,粗心啊,我的长处还是在管理啊,写程序和经管方面的能力比起来逊色不少
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 1002;
#define inf 100000000
int T,S,D;
int a,b,c;
int Dist[maxn];
int G[maxn][maxn];
int s[maxn],d[maxn];
int maxXXX;
int final[maxn];
int Dijkstra(int v0)
{
int Min;
int k;
for(int i = 0; i <= maxXXX; i++) //初始化
{
final[i] = false;
Dist[i] = G[v0][i];
}
final[v0] = 1;
Dist[v0] = 0;
for(int v = 0; v <= maxXXX; v++)
{
Min = inf;
for(int w = 0; w <= maxXXX; w++)
{
if(!final[w] && (Dist[w] < Min))
{
Min = Dist[w];
k = w;
}
}
if(Min == inf) //如果没有相邻的节点
break;
final[k] = 1;
for(int w = 0; w <= maxXXX; w++)
{
if(!final[w] && (Min + G[k][w] < Dist[w]))
{
Dist[w] = Min + G[k][w]; //更新临近点距离
}
}
}
int m = inf; //计算到每个想去的地方的最小值
for(int i = 0; i < D;i++)
{
if(m > Dist[d[i]])
{
m = Dist[d[i]];
}
}
return m;
}
int main()
{
int min;
while(cin>>T>>S>>D)
{
for(int i = 0; i < maxn;i++)
{
for(int j = 0; j < maxn; j++)
{
G[i][j] = inf;
}
}
maxXXX = 0;
for(int i = 0; i < T; i++)
{
cin>>a>>b>>c;
if(c < G[a][b])
{
G[a][b] = c;
G[b][a] = c;
}
if(maxXXX < a)
maxXXX = a; //计算最多有多少个节点
if(maxXXX < b)
maxXXX = b;
}
for(int i = 0; i < S; i++)
{
cin>>s[i];
}
for(int j = 0; j <D; j++)
{
cin>>d[j];
}
min = inf;
//memset(Dist,0,sizeof(Dist));
for(int i = 0; i < S; i++) 求从每个临近节点出发的最小值
{
if(Dijkstra(s[i]) < min)
min = Dijkstra(s[i]);
}
cout<<min<<endl;
}
return 0;
}
78ms速度还可以
注意优化