POJ-1511(ダイクストラ+プライオリティキューの最適化)

招待カード

POJ-1511

  • この質問から私は報告し、高速入力および出力、イオス:: ---ラインは、前の入力の始まりです主な機能、の最初の行に配置する必要があり、そうでない場合はシステムクレイジーで始まる、多くの問題を発見しましたWA。
  • 第二は、彼らが必死にTLEを報告した後、タイムアウトしている、問題は、アルゴリズムの複雑であるか、そうでなければ、入力があると、出力はその最初のすべての問題の入力と出力を排除し、十分に速くはないので、私は、IOSを入れてイオス何も間違った場所であり、 scanf関数は前ので、この質問を変更しました。
  • 事実は、iOSの方法はscanfのほど高速ではまだない、ということを証明しているので、将来はまだscanf関数を使用します。
  • 第二は、このバージョンは直前にも非常に危険です、このアルゴリズム自体に問題が、これはあまりにもこの問題のデータの量は、すでにN * nのアルゴリズムより速いです。
  • この質問について考えることは、主に正であり、再び後方に行く、その後、再び行くことに転送し、最終的にその上に追加します。
  • ブログの複数の方法をお勧めします。https://blog.csdn.net/qq_39665840/article/details/81437812
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
const int INF=0x3f3f3f3f;
int p,q;//p-stops;q-lines
struct edge{
    int to;
    int cost;
    edge(){}
    edge(int a,int b):to(a),cost(b){}
};
struct node{
    int dis;
    int to;
    node(){}
    node(int a,int b):dis(a),to(b){}
    bool operator<(const node& t)const{
        return dis>t.dis;
    }
};
vector<edge> G[1000006];
vector<edge> rG[1000006];
long long d[1000006];
void dijikstra(int s,int type){
    priority_queue<node> que;
    for(int i=1;i<=p;i++){
        d[i]=INF;
    }
    d[s]=0;
    que.push(node(0,s));
    while(!que.empty()){
        node temp=que.top();
        que.pop();
        int v=temp.to;
        if(d[v]<temp.dis)
            continue;
        if(type==1){
            for(int i=0;i<G[v].size();i++){
                edge e=G[v][i];
                 if(d[e.to]>d[v]+e.cost){
                    d[e.to]=d[v]+e.cost;
                    que.push(node(d[e.to],e.to));
                }
            }
        }else{
            for(int i=0;i<rG[v].size();i++){
                edge e=rG[v][i];
                if(d[e.to]>d[v]+e.cost){
                    d[e.to]=d[v]+e.cost;
                    que.push(node(d[e.to],e.to));
                }
            }
        }
    }
}
int main(){
    // ios::sync_with_stdio(false);
    // cin.tie(0);
    int t;
    cin>>t;
    while(t--){
        scanf("%d%d",&p,&q);
        int s,e,w;
        memset(G,0,sizeof(G));
        memset(rG,0,sizeof(rG));
        for(int i=0;i<q;i++){
            scanf("%d%d%d",&s,&e,&w);
            G[s].push_back(edge(e,w));
            rG[e].push_back(edge(s,w));
        }
        dijikstra(1,1);
        long long sum=0;
        for(int i=1;i<=p;i++){
            sum+=d[i];
        }
        dijikstra(1,2);
        for(int i=1;i<=p;i++){
            sum+=d[i];
        }
        cout<<sum<<endl;
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/GarrettWale/p/11404040.html