PAT 1003

来源:互联网 发布:bi数据开发工程师 编辑:程序博客网 时间:2024/05/12 14:24

Dijkstra 算法的变形

#include<stdio.h>#include<stdlib.h>#define Infinite (32765)int rescue[505],map[505][505],distance[505],team[505],shortest[505],visit[505];void Dijkstra(int s,int n){//PriorityQueue q;//q = Initialize(n+10);int i,j,u,tmp;for(i = 0;i<n;i++)distance[i] = Infinite;distance[s] = 0;shortest[s] = 1;team[s] = rescue[s];for(i = 0;i<n;i++){tmp = Infinite;for(j = 0;j<n;j++){if(!visit[j]&&distance[j]<tmp){tmp = distance[j];u = j;}}visit[u] = 1;for(j = 0;j<n;j++)if(!visit[j]){if(distance[u] + map[u][j]<distance[j]){distance[j] = distance[u] + map[u][j];team[j] = team[u] + rescue[j];shortest[j] = shortest[u];}else if(distance[u] + map[u][j] == distance[j]){shortest[j] = shortest[u] + shortest[j];if(team[j] < rescue[j] + team[u])team[j] = rescue[j] + team[u];}}//if(tmp == Infinite)//break;}}int main(){int s,d,road,v,i;//FILE *fp;//fp = fopen("1.in","r");fscanf(stdin,"%d%d%d%d",&v,&road,&s,&d);for(i = 0;i<v;i++)fscanf(stdin,"%d",&rescue[i]);int from,to,weight,j;for(i = 0;i<v;i++)for(j = 0;j<v;j++)map[i][j] = Infinite;for(i =  0;i<road;i++){fscanf(stdin,"%d%d%d",&from,&to,&weight);map[from][to] = weight;map[to][from] = weight;}Dijkstra(s,v);printf("%d %d\n",shortest[d],team[d]);}


0 0
原创粉丝点击