注意要求多次最短路径
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1020;
int G[MAXN][MAXN];
bool vis[MAXN];
int d[MAXN];
const int INF = 10000000;
int N,M,K,ServiceDistance;
void Dijkstra(int s)
{
for(int i = 1;i<=N + M;i++)
{
int MIN = INF;
int u = -1;
for(int j = 1;j <= N + M;j++)
{
if(d[j] < MIN && vis[j] == false)
{
MIN = d[j];
u = j;
}
}
if(u == -1)
{
return ;
}
vis[u] = true;
for(int v = 1;v <= N + M;v++)
{
if(d[v] > G[u][v] + d[u] && vis[v] == false && G[u][v] != INF)
{
d[v] = G[u][v] + d[u];
}
}
}
}
int main(void)
{
freopen("pat0314/in.txt","r",stdin);
cin>>N>>M>>K>>ServiceDistance;
fill(G[0],G[0] + MAXN * MAXN,INF);
for(int i = 0;i<K;i++)
{
string l,r;
int distance;
cin>>l>>r>>distance;
int left,right;
if(l[0] != 'G' && r[0] != 'G')
{
left = stoi(l);
right = stoi(r);
}
else if(l[0] == 'G' && r[0] != 'G')
{
left = stoi(l.substr(1));
left = left + N;
right = stoi(r);
}
else if(l[0] != 'G' && r[0] == 'G')
{
left = stoi(l);
right = stoi(r.substr(1));
right = right + N;
}
else
{
left = stoi(l.substr(1));
left = left + N;
right = stoi(r.substr(1));
right = right + N;
}
G[left][right] = G[right][left] = distance;
}
int needindex = -1;
double smallAverageDistance = INF;
double ansDistance = 0.0;
for(int i = N + 1;i<= N + M;i++)
{
fill(d,d + MAXN,INF);
fill(vis,vis + MAXN,false);
d[i] = 0;
Dijkstra(i);
bool flag = true;
double alldistance = 0.0;
double mindistance = INF;
int j;
for(j = 1;j<= N;j++)
{
// cout<<"d[j] "<<d[j];
if(d[j] > ServiceDistance)
{
flag = false;
break;
}
else
{
if(d[j] < mindistance)
{
mindistance = d[j];
}
}
alldistance += 1.0 * d[j];
}
double averageDistance = INF;
// cout<<endl;
averageDistance = alldistance / N;
if(flag == true && mindistance > ansDistance)
{
ansDistance = mindistance;
smallAverageDistance = averageDistance;
needindex = i;
}
else if(flag == true && mindistance == ansDistance && averageDistance < smallAverageDistance)
{
smallAverageDistance = averageDistance;
needindex = i;
}
}
if(needindex == -1)
{
cout<<"No Solution";
}
else
{
cout<<"G"<<needindex - N<<endl;
printf("%.1f %.1f",ansDistance,smallAverageDistance);
}
return 0;
}```