51nod 1459 迷宫游戏

来源:互联网 发布:itunes12怎么下载软件 编辑:程序博客网 时间:2024/05/15 15:30

加一个数组记录得分

#include <cstdio>#include <cstring>#include <set>#include <algorithm>using namespace std;const int INF = 0x3f3f3f3f;const int MAXN = 510;int G[MAXN][MAXN];int Score[MAXN];int Dist[MAXN];bool Vis[MAXN];int Res[MAXN];int n,m,s,e;void Dijkstra(){    for(int i = 0; i <= n; ++i)    {        Vis[i] = false;        Dist[i] = INF;    }    Dist[s] = 0;    Res[s] = Score[s];    int loop = n;    int minn;    int u;    while(loop--)    {        minn = INF;        for(int i = 0; i < n; ++i)            if(!Vis[i] && Dist[i] < minn)                minn = Dist[i],u = i;        Vis[u] = true;        for(int i = 0; i < n; ++i)        {            if(!Vis[i] && Dist[i] > Dist[u]+G[u][i])            {                Res[i] = Res[u]+Score[i];                Dist[i] = Dist[u] + G[u][i];            }            else if(!Vis[i] && Dist[i] == Dist[u]+G[u][i])                Res[i] = max(Res[i],Res[u]+Score[i]);        }    }}int main(){    int a,b,c;    scanf("%d %d %d %d",&n,&m,&s,&e);    for(int i = 0; i < n; ++i)        for(int j = 0; j < n; ++j)            if(i == j) G[i][j] = 0;            else G[i][j] = INF;    for(int i = 0; i < n; ++i)        scanf("%d",&Score[i]);    for(int i = 0; i < m; ++i)    {        scanf("%d %d %d",&a,&b,&c);        G[a][b] = G[b][a] = c;    }    if(s == e)    {        printf("%d %d\n",0,Score[s]);        return 0;    }    Dijkstra();    printf("%d %d\n",Dist[e],Res[e]);    return 0;}
原创粉丝点击