#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int x[300] = { 0 }, y[300] = { 0 }, n;
double dis[300][300], dir[300] = { 0 };
char cache1;
double ans = 1e10, cache2;
int main()
{
cin>>n;
for (int i = 0; i < n; i++) cin >> x[i] >> y[i];
for (int i = 0; i<n; i++)
{
for (int j = 0; j<n; j++)
{
cin >> cache1;
if (cache1 == '0') dis[i][j] = 1e10;
else dis[i][j] = dis[j][i] = sqrt(pow(x[i] - x[j], 2) + pow(y[i] - y[j], 2));
}
}
for (int k = 0; k<n; k++)
for (int i = 0; i<n; i++)
for (int j = 0; j<n; j++)
if (i != k && j != k && i != j && dis[i][k] + dis[k][j]<dis[i][j] && dis[i][k]<1e10 && dis[k][j]<1e10)
{
dis[i][j] = dis[i][k] + dis[k][j];
}
for (int i = 0; i<n; i++)
for (int j = 0; j<n; j++)
if (dis[i][j]<1e10 && dis[i][j]>dir[i]) dir[i] = dis[i][j];
for (int i = 0; i<n; i++)
for (int j = 0; j<n; j++)
if (dis[i][j] == 1e10 && i != j)
{
cache2 = dir[i] + dir[j] + sqrt(pow(x[i] - x[j], 2) + pow(y[i] - y[j], 2));
if (cache2<ans) ans = cache2;
}
for (int i = 0; i<n; i++) if (dir[i]>ans) ans = dir[i];
cout << fixed << setprecision(6) << ans << endl;
return 0;
}
#include<iostream>
using namespace std;
int v, i, j,k,u;
int MAX = 100000;
int edge[100][100];
void dijkstra(int v){
int *dist = new int[v];
int *path = new int[v];
int *s = new int[v];
for (i = 0; i < v; i++)
{
dist[i] = edge[v][i];
s[i] = 0;
if(i != v && dist[i] < MAX ) path[i] = v;
else path[i] = -1;
}
s[v] = 1;
dist[v] = 0;
for (i = 0; i < v - 1; i++)
{
int min = MAX, u = v;
for (j = 0; j < v; j++)
{
if (!s[j] && dist[j] < min)
{
u = j;
min = dist[j];
}
}
s[u] = 1;
for (k = 0; k < v; k++)
{
if (!s[k] && edge[u][k]< MAX &&dist[u]+edge[u][k] < dist[k])
{
dist[k] = dist[u] + edge[u][k];
path[k] = u;
}
}
}
int t;
cout << "终点:";
cin >> t;
int w = t;
if (path[w] == -1) {
cout << "没有路径" << endl;
return;
}
else cout << "从源点" << v << "到顶点 " << t << "的最短路径为:"<<t<<" ";
while (path[w] != v) {
cout << path[w] << " ";
w = path[w];
}
cout << path[w] << endl;
cout << " 路径长度为" << dist[t] << endl;
return;
}
int main()
{
int n;
cin >> n;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
cin >> edge[i][j];
v = 1;
dijkstra(v);
return 0;
}
堆优化/队列优化 记得去搞!!