(PAT)1003. Emergency (25)

#include<stdio.h>
#include<string.h>
#define INF 1<<10
int n,m,so,ta;
int cities[500+10][500+10];
int teams[500+10];
int dist[500+10];
int byPass[500+10];
int maxTeams[500+10];
int difDist[500+10];
bool visited[500+10];
int selectMin(int n)
{
    int minCity=-1;
    int minDis=INF;
	for(int i=0;i<n;i++)
	{

		if(!visited[i]&&dist[i]<minDis)
		{
			minCity=i;
			minDis=dist[i];
		}
	}
	if(minCity==-1)return -1;
	visited[minCity]=true;
	 for(int i=0;i<n;i++)
		{
		    if(i!=minCity)
            {
            if(cities[minCity][i]!=INF&&cities[minCity][i]+dist[minCity]<dist[i])
            {
                dist[i]=cities[minCity][i]+dist[minCity];
                difDist[i]=difDist[minCity];
                maxTeams[i]=teams[i]+maxTeams[minCity];
                byPass[i]=minCity;
            }
            else if(cities[minCity][i]!=INF&&cities[minCity][i]+dist[minCity]==dist[i])
                {
                    difDist[i]+=difDist[minCity];
                    if(maxTeams[i]<teams[i]+maxTeams[minCity])maxTeams[i]=teams[i]+maxTeams[minCity];
                }
            }
		}
		return minCity;
}
void update(int minCity)
{

}
int main()
{

 	int cityOne,cityTwo,distance;
	scanf("%d%d%d%d",&n,&m,&so,&ta);
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
		{
			if(i==j)cities[i][j]=0;
			else cities[i][j]=INF;
		}
	for(int i=0;i<n;i++)
	{
 		scanf("%d",&teams[i]);
 	}
	for(int i=0;i<m;i++)
	{
		scanf("%d%d%d",&cityOne,&cityTwo,&distance);
		cities[cityOne][cityTwo]=distance;
		cities[cityTwo][cityOne]=distance;
	}
	for(int i=0;i<n;i++)
	{
	    if(cities[so][i]!=INF&&cities[so][i]!=0)
        {
             dist[i]=cities[so][i];
             byPass[i]=so;
             maxTeams[i]=teams[so]+teams[i];
             difDist[i]=1;
        }else{
            byPass[i]=-1;
            maxTeams[i]=0;
            dist[i]=cities[so][i];
            difDist[i]=0;
        }

	    visited[i]=false;
	}
	visited[so]=true;
	difDist[so]=1;
	maxTeams[so]=teams[so];
	byPass[so]=so;
	while(true)
	{
		int minDisCity=selectMin(n);
		if(minDisCity==-1)break;
	}
	printf("%d %d",difDist[ta],maxTeams[ta]);

}

這題需要提一下的是:

1)核心步驟是Dijkstra算法

2)增加兩個矩陣分別存放最短路徑的條數以及最大的teams。在更新dist矩陣的時候一併更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章