PAT1072. Gas Station (30)

题目的测试用例数据有问题!

第一个Case 应该是

G1

2.0 3.2

一直在想3.3分母的3怎么来了。ORZ

#include <iostream>
#include <cctype>
#include <limits>
#include <cstdlib>
#include <string>
#include <stdio.h>
using namespace std;
int ma[1020][1020];
int num[1020];
int n,m,k,ds;
int i,j;
int INF=numeric_limits<int>::max();
int dp[1020];
int vis[1020];
// station --- house 最小距离越大越好 
void djkstra(int gx){
	for(i=0;i<1020;i++){
		dp[i]=INF;
		vis[i]=0;
	}
	dp[gx]=0;
	for(i=1;i<=m+n;i++){
		int x,mm=INF;
		for(j=1;j<1020;j++){
			if(num[j]!=0){
				if(!vis[j]&&dp[j]<mm){
					mm=dp[x=j];
				}
			}
		}
		vis[x]=1;
		for(j=1;j<1020;j++){
			if(num[j]!=0){
				if(ma[x][j]!=0){
					if(dp[x]+ma[x][j]<dp[j]){
						dp[j]=dp[x]+ma[x][j];
					}
				}
			}
		}
	}

}
//  minimum distance  in service range   smallest average
int main()
{
	cin>>n>>m>>k>>ds;
	for(i=1;i<=n;i++) num[i+10]=1;
	for(i=1;i<=m;i++) num[i]=1;
	for(i=0;i<k;i++){
		string p1,p2;
		int dist;
		int a,b;
		cin>>p1>>p2>>dist;
		if(isdigit(p1[0])) a=atoi(p1.data())+10;
		else {
			a=atoi(p1.substr(1).data());
		}
		if(isdigit(p2[0])) b=atoi(p2.data())+10;
		else {
			b=atoi(p2.substr(1).data());
		}
		ma[a][b]=ma[b][a]=dist;
	}
	int disMinA=-1;
	int sumDisA=0;
	int inde=INF;int t;
	int isInA=0;
	for(t=1;t<=m;t++){
		djkstra(t);	
		// distance is set find minimum
		int isIn=1;
		int disMin=INF;
		int sumDis=0;
		for(int p=1;p<=n;p++){
			if(dp[p+10]>ds){
				isIn=0;
				break;
			}
		}
		if(isIn){
			isInA=1;
			for(int p=1;p<=n;p++){
				sumDis+=dp[p+10];
				if(disMin>dp[p+10]) disMin=dp[p+10];
			}
			if(disMin>disMinA){
				disMinA=disMin;
				sumDisA=sumDis;
				inde=t;
			}else if(disMin==disMinA){
				if(sumDis<sumDisA){
					inde=t;sumDisA=sumDis;
				}else if(sumDis==sumDisA){
					if(inde>t) inde=t;
				}
			}
		}
	}
	if(isInA){
		cout<<"G"<<inde<<endl;
		printf("%.1f %.1f\n",disMinA+0.0,(sumDisA+0.0)/n);
	}else{
		cout<<"No Solution"<<endl;
	}
	return 0;
}

  

posted @ 2016-04-11 16:33  Yellowman  阅读(289)  评论(0编辑  收藏  举报
TVRBMExqRXlPQzR5TXpjdU1UVTEK\n