有几个注意点:
1.output案例是错的,是3.2而不是3.3
1.output案例是错的,是3.2而不是3.3
2.注意理解题意,是要求加油站到各个站点最短距离最大,但是有不能超过最大服务距离
3.stringstream的应用
附上代码:
#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<sstream>
using namespace std;
const int INF=1000000;
int MinDist[12][1020];
int ma[1020][1020];
int N,M,R,MaxDist,SumTemp;
int isread[1020];
int dijkstra(int node){//常规就行了,加一点细节的判断
SumTemp=0;
int i,min=INF,MinRe=INF;
for(i=0;i<1020;i++){
isread[i]=0;
MinDist[node-N][i]=INF;
}
int start=node;
MinDist[node-N][start]=0;
while(1){
min=INF;
for(i=N+M;i>=1;i--){
if(MinDist[node-N][i]<min&&isread[i]==0){
min=MinDist[node-N][i];
start=i;
}
}
if(isread[start]==1)
break;
isread[start]=1;
if(start<=N){
SumTemp+=MinDist[node-N][start];
if(MinDist[node-N][start]<MinRe)
MinRe=MinDist[node-N][start];
if(MinDist[node-N][start]>MaxDist)
return -2;
}
for(i=1;i<N+M+1;i++){
if(MinDist[node-N][i]>MinDist[node-N][start]+ma[i][start]&&isread[i]==0){
MinDist[node-N][i]=MinDist[node-N][start]+ma[start][i];
}
}
}
return MinRe;
}
int exchange(string s){//返回string转化成int量的结果
int answer;
if(s[0]=='G'){
stringstream tt(s.substr(1,s.size()));
tt>>answer;
return answer+N;
}
else{
stringstream tt(s);
tt>>answer;
return answer;
}
}
int main(){
int i,j,c,Mini,suf=INF;
double sum=0,min=-1;
string a,b;
cin>>N>>M>>R>>MaxDist;
for(i=0;i<1020;i++)
for(j=0;j<1020;j++)
ma[i][j]=INF;
for(i=0;i<R;i++){
cin>>a>>b>>c;
ma[exchange(a)][exchange(b)]=c;//建立无向图
ma[exchange(b)][exchange(a)]=c;
}
for(i=N+1;i<N+M+1;i++){
j=dijkstra(i);//对于各个可能建加油站的点用单源最短路劲算法,ps可能拼错了
if(j>min||(j==min&&suf>SumTemp)){
min=j;
Mini=i;
suf=SumTemp;
}
}
if(min==-1){
printf("No Solution\n");
return 0;
}
cout<<"G"<<Mini-N<<endl;
for(i=1;i<=N;i++)
sum+=MinDist[Mini-N][i];
printf("%.1f %.1f\n",min,sum/N);
}