1072 Gas Station

#include<bits/stdc++.h>
using namespace std;
const int INF=1000000000;
const int MAXN=1020;
int G[MAXN][MAXN];
int d[MAXN];
int n,m,k,ds;
bool vis[MAXN];
void dij(int v){
	fill(d,d+MAXN,INF);
	d[v]=0;
	for(int j=1;j<=n+m;j++){
		int k=-1;int MIN=INF;
		for(int i=1;i<=n+m;i++){
			if(vis[i]==false&&d[i]<MIN){
				k=i;MIN=d[i];
			}
		}
		if(k==-1) return;
		vis[k]=true;
		for(int i=1;i<=m+n;i++){
			if(vis[i]==false&&G[k][i]!=INF){
				if(d[k]+G[k][i]<d[i]){
					d[i]=d[k]+G[k][i];
				}
			}
		}
	}
}
int getid(string a){
	int ans=0;
	if(a[0]=='G'){
		a=a.substr(1,a.length());
		for(int i=0;i<a.length();i++){
			ans=ans*10+(a[i]-'0');
		}
		ans+=n;
	}else{
		for(int i=0;i<a.length();i++){
			ans=ans*10+(a[i]-'0');
		}
	}
	return ans;
}
int main()
{
	//freopen("in.txt","r",stdin);
	cin>>n>>m>>k>>ds;
	fill(G[0],G[0]+MAXN*MAXN,INF);
	for(int i=0;i<k;i++){
		string p1,p2;int dis;
		cin>>p1>>p2>>dis;
		int t1,t2;
		t1=getid(p1);
		t2=getid(p2);
		G[t1][t2]=dis;
		G[t2][t1]=dis;
	}
	double optmin=-1;
	double optans=INF;
	string ppp;
	for(int i=n+1;i<=n+m;i++){
		fill(vis,vis+MAXN,false);
		dij(i);
		double ans=0;
		double tempmin=INF;
		int flag=0;
		for(int j=1;j<=n;j++){
			ans+=d[j];
			if(d[j]<tempmin){
				tempmin=d[j];
			}
			if(d[j]>ds){
				flag=1;break;
			}
		}
		if(flag==1){
			continue;
		}else{
			ans/=(n*1.0);
			if(tempmin>optmin){
				ppp.clear();
				optmin=tempmin;
				optans=ans;
				ppp="G"+to_string(i-n);
			}else if(tempmin==optmin){
				if(ans<optans){
					ppp.clear();
					optans=ans;
					ppp="G"+to_string(i-n);
				}
			}
		}
	}
	if(optans==INF||optmin==-1){
		printf("No Solution");
		return 0;
	}
	cout<<ppp<<endl;
	printf("%.1lf %.1lf\n",optmin,optans);
	return 0; 
}
 

猜你喜欢

转载自blog.csdn.net/csg3140100993/article/details/82219493