UVA 11374 Airport Express(dijkstra+枚举)

一开始想的是加一个flip标记,每条路只能由一个flip标记,但是最后发现这个标记对于记录最短时间的d数组是没有影响的。

对于x与y之间的商业线,两个起点分别判断一下,一开始只判断一个,一直WA。

#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=1000+5;
const int inf=(1<<27);
struct HeapNode{
    int d,u;
    bool operator < (const HeapNode &rhs) const {
        return d>rhs.d;
    }
};
struct edge{
    int from,to,dist;
};
struct Dijkstra{
    int n,m;
    vector edges;
    vector G[maxn];
    bool done[maxn];
    int d[maxn];
    int p[maxn];
    
    void init(int n){
        this->n=n;
        for(int i=0;i pq;
        for(int i=0;id[u]+e.dist){
                    d[e.to]=d[u]+e.dist;
                    p[e.to]=G[u][i];
                    pq.push((HeapNode){d[e.to],e.to});
                }
            }
        }
    }
};
Dijkstra dij;
int n,s,e;
int m,k;
int f[maxn],g[maxn];
int p1[maxn],p2[maxn];
void printA(int k){
    if(k==s){
        printf("%d",k+1);
        return ;
    }
    int t=p1[k];
    edge e=dij.edges[t];
    printA(e.from);
    printf(" %d",k+1);
}
void printB(int k){
    if(k==e){
        printf(" %d",k+1);
        return ;
    }
    int t=p2[k];
    edge e=dij.edges[t];
    printf(" %d",k+1);
    printB(e.from);
}
int main()
{
    int count=0;
    while(~scanf("%d%d%d",&n,&s,&e))
    {
        if(count++) printf("\n");
        s--;e--;
        dij.init(n);
        scanf("%d",&m);
        for(int i=0;i

你可能感兴趣的:(图论:最短路,dijkstra)