图论模板

#include<bits/stdc++.h>
using namespace std;
const int maxv=1001;
const double dINF=1e20;
struct Edge{
    int begin, end;
    double len;
    Edge(int begin, int end, double len):begin(begin), end(end), len(len){}    
};
struct Map_list{
    int g_size, v_size, pre[maxv];
    vector<Edge> edges;
    vector<int>     G[maxv];
    Map_list(){v_size=g_size=0;}
    void AddEdge(int begin, int end, double len){
        edges.push_back(Edge(begin, end, len));
        G[begin].push_back(edges.size()-1);
        g_size++;        
    }
    void Make(int n, int m){
        v_size=n;
        for(int i=0; i<m; i++){
            int begin, end;
            double len;
            cin >> begin >> end >> len;
            AddEdge(begin, end, len);
        }
    }
    void show(){
        for(int i=1; i<=v_size; i++)
            for(int j=0; j<G[i].size(); j++){
                Edge & e=edges[G[i][j]];
                cout << e.begin << " " << e.end << " "<< e.len << endl;
            }
    }
    void showway
    double dijkstra(int from, int to, bool show=0){
        int djused[maxv];
        double djdis[maxv];
        memset(pre, 0, sizeof(pre));
        memset(djused, 0, sizeof(djused));
        for(int i=1; i<=v_size; i++)
            djdis[i]=dINF;
        djdis[from]=0;
        for(int i=0; i<G[from].size(); i++)
            djdis[edges[G[from][i]].end]=edges[G[from][i]].len;
        for(int i=1; i<=v_size; i++){
            int si;
            double ma=dINF;
            for(int j=0; j<G[from].size(); j++)
                if(djdis[edges[G[from][j]].end]<ma)    {si=edges[G[from][j]].end; ma=djdis[si];}
            for(int j=0; j<G[si].size(); j++){
                if(djdis[si]+edges[G[si][j]].len<djdis[edges[G[si][j]].end]){
                    djdis[edges[G[si][j]].end]=djdis[si]+edges[G[si][j]].len;
                    pre[edges[G[si][j]].end]=si;
                }
            }
        }
        if(show==true){
            cout << from << " ";
            showway(from, to);
            cout << to << endl;
        }
        return djdis[to];    
    }
}map1;
int main(void){
    int n, m;
    cin >> n >> m;
    map1.Make(n, m);
    cout << map1.dijkstra(1, 2) << endl;
}

posted @ 2018-05-15 18:24  junk_yao  阅读(115)  评论(0编辑  收藏  举报