实验室和食堂

                 实验室和食堂

 

Description

 

2012新的暑期集训开始了,一切都还相当不错,但是有一个问题成为了同学们的难题,那就是从实验室到食堂时,天气是非常的炎热,以至于大家都尽量避免从没有遮阴的地方走过,但是某些路径又不得不从没有遮阴的地方走过,所以现在难题出来了,给予你一些单向路段,让你找出从实验室到食堂,晒太阳最少的路径长度,以及该条路径的总长度。如果存在多条最少晒太阳的路径,则总长度要求最短。

 

Input

输入n和m,表明是有n<=1000个转折点,m条路径,然后输入m(m<=100000)条路径,每一条路径包括4个数据,s,e,dis1 , dis2,分别表示该条路径的起点,

终点,路径总长度,以及没有遮阴路径的长度(dis1>=dis2);

结果保证小于2^31

 

Output

输出两个值,第一个值是没有遮阴路径的最小总长度,第二个是该条路径的总长度,如果没有遮阴路径的最小总长度相等,

输出二者中总路径长度最小的那条路径的长度值。

 

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;
} 

 

 

 

posted on 2012-08-17 23:56  即为将军  阅读(324)  评论(0)    收藏  举报

导航