天梯地图(30 分)

来源:互联网 发布:淘宝避开同款教程 编辑:程序博客网 时间:2024/05/17 02:24

这个题目,也是最短路,不过路径最短的时候,结点要最小,路径最快的时候,路径最短,所以跑两遍就可以,由于点的个数不多,所以对于两个因素直接用二维数组记录一下就可以。

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <vector>#include <map>#include <queue>#include <math.h>#include <stack>#include <utility>#include <string>#include <sstream>#include <cstdlib>#include <set>#define LL long longusing namespace std;const int INF = 0x3f3f3f3f;const int maxn = 500 + 10;int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};struct Edge{    int to;    int len;    int time;    Edge(int a = 0,int b = 0,int c = 0)    {        to = a;        len = b;        time = c;    }};vector<Edge> G[maxn];int dis[maxn][2];int fis[maxn][2];int visD[maxn];int visF[maxn];int ansD[maxn];int ansF[maxn];int preD[maxn];int preF[maxn];int n,m;int st,en;void init(){    memset(ansD,0,sizeof(ansD));    memset(ansF,0,sizeof(ansF));}void spfaD(int s){    memset(dis,INF,sizeof(dis));    memset(visD,0,sizeof(visD));    memset(preD,-1,sizeof(preD));    dis[s][0] = 0;    dis[s][1] = 0;    visD[s] = 1;    preD[s] = -1;    queue<int>que;    que.push(s);    while(!que.empty())    {        int v = que.front();        que.pop();        for(int i = 0; i < G[v].size(); i++)        {            Edge e = G[v][i];            int u = e.to;            int cost = e.len;            if(dis[u][0] > dis[v][0] + cost || (dis[u][0] == dis[v][0] + cost && dis[u][1] > dis[v][1] + 1))            {                dis[u][0] = dis[v][0] + cost;                dis[u][1] = dis[v][1] + 1;                preD[u] = v;                if(!visD[u])                {                    visD[u] = 1;                    que.push(u);                }            }        }        visD[v] = 0;    }}void spfaF(int s){    memset(visF,0,sizeof(visF));    memset(preF,-1,sizeof(preF));    memset(fis,INF,sizeof(fis));    fis[s][0] = fis[s][1] = 0;    visF[s] = 1;    preF[s] = -1;    queue<int> que1;    que1.push(s);    while(!que1.empty())    {        int v = que1.front();        que1.pop();        for(int i = 0; i < G[v].size(); i++)        {            Edge e1 = G[v][i];            int u = e1.to;            if(fis[u][0] > fis[v][0] + e1.time || (fis[u][0] == fis[v][0]+e1.time) && (fis[u][1] > fis[v][1] + e1.len))            {                fis[u][0] = fis[v][0] + e1.time;                preF[u] = v;                fis[u][1] = fis[v][1] + e1.len;                if(!visF[u])                {                    visF[u] = 1;                    que1.push(u);                }            }        }        visF[v] = 0;    }}int main(){    scanf("%d %d",&n,&m);    init();    for(int i = 0; i < m; i++)    {        int x,y,w,d,flag;        scanf("%d %d %d %d %d",&x,&y,&flag,&d,&w);        if(flag)        {            G[x].push_back(Edge(y,d,w));        }        else        {            G[x].push_back(Edge(y,d,w));            G[y].push_back(Edge(x,d,w));        }    }    scanf("%d %d",&st,&en);    spfaF(st);    spfaD(st);    ansD[0] = ansF[0] = 0;    int cnt1,cnt2;    cnt1 = cnt2 = 0;    int t = en;    while(t != -1)    {        ansD[++cnt1] = t;        t = preD[t];    }    t = en;    while(t != -1)    {        ansF[++cnt2] = t;        t = preF[t];    }    int flag = 0;    if(cnt1 != cnt2)    {        flag = 1;    }    else    {        for(int i = 1; i <= cnt1; i++)        {            if(ansD[i] != ansF[i])            {                flag = 1;                break;            }        }    }    if(!flag)    {        printf("Time = %d; Distance = %d: ",fis[en][0],dis[en][0]);//Time = 3; Distance = 4: 3 => 2 => 5        for(int i = cnt1; i >= 1; i--)        {            if(i == 1)                printf("%d",ansD[i]);            else            {                printf("%d => ",ansD[i]);            }        }    }    else    {        printf("Time = %d: ",fis[en][0]);//Time = 6: 5 => 4 => 8 => 3        for(int i = cnt2; i >= 1; i--)        {            if(i == 1)                printf("%d",ansF[i]);            else            {                printf("%d => ",ansF[i]);            }        }        puts("");        printf("Distance = %d: ",dis[en][0]);        for(int i = cnt1; i >= 1; i--)        {            if(i == 1)                printf("%d",ansD[i]);            else            {                printf("%d => ",ansD[i]);            }        }    }    return 0;}