您的位置:首页 > 其它

(PAT)1003. Emergency (25)

2014-01-08 16:15 447 查看
#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矩阵的时候一并更新。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c dijkstra oj pat zju