hdu1874 Dijkstra(堆优化)+floyd

来源:互联网 发布:猎豹免费wifi软件 编辑:程序博客网 时间:2024/06/05 22:37
//感谢jianshen
#include <iostream>#include <cstdio>#include <algorithm>#include <cstdlib>#include <queue>#include <cstring>#include <utility>#define MAXN 2510#define MAXM 6210using namespace std;int n,m,s,t;typedef pair<int ,int> PII;struct edge {int v, w;edge *next;void add(int y, int z, edge *&head){ v = y; w = z; next = head; head = this; }}Te[MAXM*2],*Pe=Te,*head[MAXN*2];void add_edge(int x, int y, int z) {Pe++->add(y, z, head[x]);}int dist[MAXN];bool visit[MAXN];void dijkstra(int x) {priority_queue<PII>q;while (!q.empty()) q.pop();memset(dist, 0x3f, sizeof(dist));memset(visit, 0, sizeof(visit));dist[x] = 0;q.push(make_pair(0, x));while (!q.empty()) {while (!q.empty() && visit[q.top().second]) q.pop();if (q.empty()) break;PII t = q.top(); q.pop();int i = t.second;dist[i] = -t.first;visit[i]=true;for (edge *p = head[i]; p; p = p->next)if (!visit[p->v]) q.push(make_pair(-(dist[i] + p->w), p->v));}}void init(){     memset(head, 0, sizeof(head));     Pe=Te;for(int i=1;i<=m;i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);add_edge(x,y,z);        add_edge(y,x,z);}    scanf("%d%d",&s,&t);}int main(){    while(scanf("%d%d",&n,&m)==2){        init();        if(s==t){cout<<0<<endl;continue;}        dijkstra(s);        cout<<(dist[t]==0x3f3f3f3f?-1:dist[t])<<endl;    }}

floyd

#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>using namespace std;const int MAXN = 555;int f[MAXN][MAXN], s, t, n, m;int main(){    while (~scanf("%d%d", &n, &m))    {        memset(f, 0x3f, sizeof(f));        int tmp=f[1][1];        for (int i = 1; i <= m; i++)        {            int u, v, w;            scanf("%d%d%d", &u, &v, &w);            ++u; ++v;//注意下标位置            //printf("Add %d %d %d\n", u, v, w);            f[u][v] = f[v][u] = min(w, f[u][v]);//邻接矩阵,重边= =        }        scanf("%d%d", &s, &t);        if(s == t) {//特判            cout<<0<<endl;            continue;        }        for (int k = 1; k <= n; k++)            for (int i = 1; i <= n; i++)                for (int j = 1; j <= n; j++)                    if (f[i][j] > f[i][k] + f[k][j])                        f[i][j] = f[i][k] + f[k][j];        printf("%d\n", f[s + 1][t + 1]==tmp?-1:f[s+1][t+1]);    }    return 0;}


0 0