hdu1874

来源:互联网 发布:Minecraft mac光影 编辑:程序博客网 时间:2024/06/15 08:10

总共四种做法,dijkstra,bellman,spfa,floyd都可以做(主要因为数据比较小),如果数据比较大的话,用dijkstra和spfa比较合理,方法较为固定。以下是dijkstra的代码。

#include <iostream>#include <memory.h>#include <queue>using namespace std;int v[10002],next[10002],w[10002];int first[202],d[202],e;typedef pair<int,int> pii;void init(){    e = 0;    memset(first,-1,sizeof(first));}void add_edge(int a,int b,int c){    v[e] = b;next[e] = first[a];w[e] = c;first[a] = e++;}void dijkstra(int src){    priority_queue <pii,vector<pii>,greater<pii> > q;    memset(d,-1,sizeof(d));    d[src] = 0;    q.push(make_pair(0,src));    while(!q.empty()){        while(!q.empty() && q.top().first > d[q.top().second]) q.pop();        if(q.empty()) break;        int u = q.top().second;        q.pop();        for(int i = first[u];i != -1;i = next[i]){            if(d[v[i]] == -1 || d[v[i]] > d[u] + w[i]){                d[v[i]] = d[u] + w[i];                q.push(make_pair(d[v[i]],v[i]));            }        }    }}int main(){   int n,m,a,b,c,x,y;   while(cin >> n >> m && n + m > 0){        init();    for(int i = 0;i < m;i ++){        cin >> a >> b >> c;        add_edge(a,b,c);        add_edge(b,a,c);    }    cin >> x >> y;    dijkstra(x);    cout << d[y] << endl;   }   return 0;}


0 0
原创粉丝点击