PAT 1072 가스 스테이션 - Dijkstra 알고리즘
20972 단어 PAT
1072 Gas Station
사고의 방향
제목 의 대 의 는 n 개의 주민 점 과 m 개의 주유소 가 존재 한다.지금 은 이 m 개 주유소 중 하 나 를 골 라 서 이 주유소 에서 모든 주민 점 에서 가장 짧 은 거리의 최 단 거 리 를 최대 로 하고 입력 에서 지정 한 범 위 를 초과 해 서 는 안 된다 고 요구 해 야 한다.주의해 야 할 것 은 최 단 거 리 를 계산 할 때 는 주유소 와 주민 점 사이 에 도 접근 할 수 있 는 경로 가 있 기 때문에 주민 점 과 주유 소 를 고려 해 야 한 다 는 점 이다.편 의 를 위해 주유소 번 호 를 n + 1 ~ n + m 사이 로 바 꿉 니 다.나 는 이 단계 가 너 에 게 매우 간단명료 할 것 이 라 고 생각한다.
코드
#include
using namespace std;
int n,m,k,range;
const int inf = 0x3f3f3f;
int graph[1020][1020];//
int dis[1020],ans[1020];//
int ansid = -1;
double ansmin = -1,ansave = inf;
void dijkstra(int s){
// s 。 ??
fill(dis,dis+1020,inf);
bool visited[1020];
fill(visited,visited+1020,false);
dis[s] = 0;
bool isok = true;
double tmpmin = inf;
double tmpsum = 0;//
// cout<
for(int i=1;i<=n+m;i++){
int u = -1,mind = inf;//
for(int j = 1;j<=n+m;j++){
if(!visited[j] && dis[j] < mind){
u = j;
mind = dis[j];
}
}
if(u == -1)break;//
visited[u] = true;
if(u <= n){
tmpsum += mind;
}
if(u<=n && mind > range){
//
isok = false;
break;
}else if (u<=n && mind < tmpmin){
tmpmin = mind;
}
for(int k = 1;k <= n+m;k++){
if(!visited[k] && dis[u]+graph[u][k] < dis[k]){
dis[k] = dis[u]+graph[u][k];
}
}
}
if(isok){
tmpsum /= (1.0*n);
if(tmpmin > ansmin){
//
ansid = s;
ansmin = tmpmin; // 。
ansave = tmpsum;
}else if(tmpmin == ansmin){
// ,
if(tmpsum < ansave){
ansid = s;
ansmin = tmpmin;
ansave = tmpsum;
}
}
}
}
int main(){
//
//
//
//
for(int i =0;i<=1020;i++){
for(int j=0;j<1020;j++){
graph[i][j] = inf;
}
}
scanf("%d%d%d%d",&n,&m,&k,&range);
//1-n ,n+1~n+m
for(int i=0;i<k;i++){
string a,b;
int ta=0,tb=0,dis;
cin>>a>>b>>dis;
if(a[0]=='G') ta = n + stoi(a.substr(1));
else ta = stoi(a);
if(b[0]=='G') tb = n + stoi(b.substr(1));
else tb = stoi(b);
graph[ta][tb] = graph[tb][ta] = min(graph[ta][tb],dis);//
}
for(int i=n+1;i<=n+m;i++){
dijkstra(i);
}
if(ansid == -1){
printf("No Solution
");
}else{
string id = "G"+to_string(ansid-n) ;
cout<<id<<endl;
printf("%0.1f %0.1f
",ansmin,ansave);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
PAT A 1049. Counting Ones (30)제목 The task is simple: given any positive integer N, you are supposed to count the total number of 1's in the decimal fo...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.