实验室和食堂
实验室和食堂
Description
2012新的暑期集训开始了,一切都还相当不错,但是有一个问题成为了同学们的难题,那就是从实验室到食堂时,天气是非常的炎热,以至于大家都尽量避免从没有遮阴的地方走过,但是某些路径又不得不从没有遮阴的地方走过,所以现在难题出来了,给予你一些单向路段,让你找出从实验室到食堂,晒太阳最少的路径长度,以及该条路径的总长度。如果存在多条最少晒太阳的路径,则总长度要求最短。
Sample Input
3 4 1 2 10 2 1 2 11 1 2 3 5 2 2 3 7 1 4 4 1 2 10 2 2 4 10 3 1 3 5 3 3 4 16 2
Sample Output
2 18 5 20
分析:
起点为1,终点为n,直接用Dijkstra就搞定
#include<stdio.h> #include<string.h> #define inf 0xffffff #define MAX 1002 int dis[MAX]; int Way[MAX]; int used[MAX]; int nNode , nWay; struct node { int power; int sp; }Map[MAX][MAX]; void dij(int end) { int i , j , min , mink; for(i = 0 ; i <= nNode ; ++i) { dis[i] = inf; Way[i]=inf; } dis[1] = 0;//注意两个都要初始化 Way[1]=0; for(i = 1 ; i < nNode ; ++i) { for(j =1 , min = inf ; j <=nNode ; ++j) { if(!used[j] && dis[j] < min) { min = dis[j]; mink = j; } } if(min == inf) { break; } used[mink] = 1; for(j = 1 ; j <= nNode ; ++j) { if(!used[j] && dis[j] > dis[mink] + Map[mink][j].sp) { dis[j] = dis[mink] + Map[mink][j].sp; Way[j] = Way[mink] + Map[mink][j].power; } else if(!used[j] && dis[j] == dis[mink] + Map[mink][j].sp&&Way[j]>Way[mink] + Map[mink][j].power)//没有遮阴路径相等,取路径短的 { Way[j] = Way[mink] + Map[mink][j].power; } } } printf("%d %d\n",dis[end],Way[end]); } int main() { int start , end , power , i , j,sp; while(scanf("%d %d",&nNode,&nWay) != EOF) { for(i = 0 ; i <= nNode ; ++i) { for(j = 0 ; j <= nNode ; ++j) { Map[i][j].sp = inf; Map[i][j].power = inf; } used[i] = 0; } while(nWay--) { scanf("%d %d %d %d",&start,&end,&power,&sp); if(Map[start][end].sp > sp)//留心题中说的"单向公路",在这里贡献了几次wa { Map[start][end].sp = sp; // Map[end][start].sp = sp; Map[start][end].power = power; // Map[end][start].power = power; } else if(Map[start][end].sp == sp&&Map[start][end].power > power)//没有遮阴路径相等,取路径短的 { Map[start][end].power = power; //Map[end][start].power = power; } } dij(nNode); } return 0; }
浙公网安备 33010602011771号