HDU3499 Flight (兩遍dijkstra)

錯誤百出調試多次的代碼

#include<queue>  
#include<map>  
#include<string>  
#include<iostream>  
#define INF 1e17
#define maxn 100010

using namespace std;
//堆優化+vector<Edge> 
//類


struct qnode{//堆結點 
    int v;//頂點編號
    long long dis;//頂點到起點的距離
    qnode(int v,long long d):v(v),dis(d){
    } ;
    qnode(){

    };
    friend bool operator < (qnode a,qnode b){//默認<,最大堆
        return a.dis>b.dis;//最小堆 
    }
};

struct Edge{
    //從某個頂點出發到達點v花費c 
    int v;
    long long c;
    Edge(int v,long long c):v(v),c(c){
    };
}; 

class Graph{
    public:
    vector<Edge> E[maxn];//圖,鄰接表
    bool vis[maxn];
    long long dis[maxn];
    int path[maxn];
    int n;
    int sc,di;
    public:
        void addEdge(int u,int v,long long w){
            E[u].push_back(Edge(v,w));
        }
        void read(){

            int m;
            cin>>n>>m;
            int u,v;
            long long w;
            for(int i=0;i<m;i++){
                cin>>u>>v>>w;
                addEdge(u,v,w);
                //雙向 addEdge(v,u,w); 
            }
        }
        void init2(int start,int end,int nn){
            sc=start;
            di=end;
            n=nn;

        }

        void dijkstra(){
            //init

            for(int i=1;i<=n;i++){

                dis[i]=INF;
                vis[i]=0; 
                path[i]=-1;
            }
            dis[sc]=0;
            //
            priority_queue<qnode> Q;
            Q.push(qnode(sc,0));
            //
            qnode tmp;
            while(!Q.empty()){
                //findmin
                tmp=Q.top();Q.pop();
                int u=tmp.v;
                if(vis[u])continue;
                vis[u]=true;
                //鬆弛
                for(int i=0;i<E[u].size();i++){//點u所有的出邊 
                    int v=E[u][i].v;
                    long long cost=E[u][i].c;
                    if(!vis[v]&&dis[v]>dis[u]+cost){
                        dis[v]=dis[u]+cost;
                        path[v]=u;
                        //將被鬆弛過的點加入隊列
                        Q.push(qnode(v,dis[v]));  
                    }
                } 
            }

        } 

        void put(){
            for(int i=1;i<=n;i++)cout<<dis[i]<<" ";
            cout<<endl;
        }

};
//利用map映射城市名得到頂點編號 
int temp=1;
map<string,int> mp;  
int ID(string s)  
{  
    if(mp.find(s)==mp.end())  
        mp[s]=temp++;  
    return mp[s];  
}   

//邊節點
struct enode{
    int u,v;
    long long w;
    enode(int u,int v,int w):u(u),v(v),w(w){
    };
    enode(){
    };

}; 

vector<enode> Ed;//存儲邊的數組 

Graph G1,G2;
int main(){

    int n,m;
    string s,ss;
    long long weight;
    int u,v;
    while(cin>>n>>m){
        //忘記讀nm×n 
        mp.clear();
        temp=1;
        Ed.clear();
        for(int i=0;i<=n;i++){
                G1.E[i].clear();
                G2.E[i].clear();
            }
        //
        for(int i=0;i<m;i++){
            cin>>s>>ss>>weight;
            u=ID(s);
            v=ID(ss);

            Ed.push_back(enode(u,v,weight)); 
            G1.addEdge(u,v,weight);
            G2.addEdge(v,u,weight);//單向路,所以應反向建圖 
        } 
        //
        cin>>s>>ss;
        u=ID(s);
        v=ID(ss);

        G1.init2(u,v,n);//正向
        G2.init2(v,u,n);//反向;
        //最開始沒調用dijkstra函數×2 
        G1.dijkstra();
        G2.dijkstra();
        //G1.put();
        //G2.put();
        long long min=INF;
        //cout<<v<<" : "<<G1.dis[v]<<endl;
        if(G1.dis[v]>=INF){
            cout<<-1<<endl;
            //break;導致退出程序,不能多組樣例 

        }else{

        enode tmp;
        for(int i=0;i<Ed.size();i++){
            tmp=Ed[i];
            u=tmp.u;
            v=tmp.v;
            if(G1.dis[u]+G2.dis[v]+tmp.w/2<min){
                min=G1.dis[u]+G2.dis[v]+tmp.w/2;

            }
        } 
        cout<<min<<endl;
    }
        }

    return 0;
} 

不寫思路了,貼個鏈接這裏寫鏈接內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章