zoukankan      html  css  js  c++  java
  • hdu 1874 畅通工程(spfa 邻接矩阵 邻接表)

    题目链接

    畅通工程,可以用dijkstra算法实现。

    听说spfa很好用,来水一发

    邻接矩阵实现:

    #include <stdio.h>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #include <deque>
    #include <iomanip>
    #include <iostream>
    #include <list>
    #include <map>
    #include <queue>
    #include <set>
    #include <utility>
    #include <vector>
    #define mem(arr, num) memset(arr, 0, sizeof(arr))
    #define _for(i, a, b) for (int i = a; i <= b; i++)
    #define __for(i, a, b) for (int i = a; i >= b; i--)
    #define IO                     
      ios::sync_with_stdio(false); 
      cin.tie(0);                  
      cout.tie(0);
    using namespace std;
    typedef long long ll;
    const ll inf = 0x3f3f3f3f;
    const double EPS = 1e-10;
    const ll mod = 1000000007LL;
    const int N = 200 + 5;
    int mp[N][N], mp1[N][N];
    int dis[N], vis[N];
    int V, E;
    void spfa(int start) {
      for (int i = 0; i <= V; i++) dis[i] = inf;
      dis[start] = 0;
      vis[start] = 1;
      queue<int> q;
      q.push(start);
      while (!q.empty()) {
        int v = q.front();
        q.pop();
        vis[v] = 0;
        for (int i = 1; i <= mp1[v][0]; i++) {
          if (dis[mp1[v][i]] > dis[v] + mp[v][mp1[v][i]]) {
            dis[mp1[v][i]] = dis[v] + mp[v][mp1[v][i]];
            if (vis[mp1[v][i]] == 0) q.push(mp1[v][i]), vis[mp1[v][i]] = 1;
          }
        }
      }
    }
    int main() {
      int s, e, value;
      while (cin >> V >> E) {
        mem(mp,0); mem(mp1,0); mem(vis,0);
        _for(i, 1, E) {
          cin >> s >> e >> value;
          if (mp[s][e] != 0 && mp[s][e] < value) continue;
          mp1[s][0]++;
          mp1[s][mp1[s][0]] = e;
          mp[s][e] = value;  //记录mp度并且记录每个度的点的下标。
          mp1[e][0]++;
          mp1[e][mp1[e][0]] = s;
          mp[e][s] = value;
        }
        int start, _end;
        cin >> start >> _end;
        spfa(start);
        if (dis[_end] < inf)
          cout << dis[_end] << endl;
        else
          cout << "-1" << endl;
      }
      return 0;
    }

     邻接表实现:

    #include <stdio.h>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #include <deque>
    #include <iomanip>
    #include <iostream>
    #include <list>
    #include <map>
    #include <queue>
    #include <set>
    #include <utility>
    #include <vector>
    #define mem(arr, num) memset(arr, 0, sizeof(arr))
    #define _for(i, a, b) for (int i = a; i <= b; i++)
    #define __for(i, a, b) for (int i = a; i >= b; i--)
    #define IO                     
      ios::sync_with_stdio(false); 
      cin.tie(0);                  
      cout.tie(0);
    using namespace std;
    typedef long long ll;
    const ll inf = 0x3f3f3f3f;
    const double EPS = 1e-10;
    const ll mod = 1000000007LL;
    const int N = 200 + 5;
    const int MAXN = 1 << 17;
    int mp[N][N], mp1[N][N];
    int dis[N], vis[N];
    int V, E;
    int first[N];
    int num = 1;
    struct edge {
      int point, next, value;
    } e[MAXN];
    void add(int u, int v, int w) {
      e[num].point = v;
      e[num].next = first[u];
      e[num].value = w;
      first[u] = num++;
    }
    void spfa(int start) {
      for (int i = 0; i <= V; i++) dis[i] = inf;
      dis[start] = 0;
      vis[start] = 1;
      queue<int> q;
      q.push(start);
      while (!q.empty()) {
        int v = q.front();
        q.pop();
        vis[v] = 0;
        for (int tmp = first[v]; tmp != -1; tmp = e[tmp].next) {
          if (dis[e[tmp].point] > dis[v] + e[tmp].value) {
            dis[e[tmp].point] = dis[v] + e[tmp].value;
            if (!vis[e[tmp].point]) vis[e[tmp].point] = 1, q.push(e[tmp].point);
          }
        }
      }
    }
    int main() {
      int s, e, value;
      while (cin >> V >> E) {
        num = 1;
        mem(vis, 0);
        int u, v, w;
        _for(i, 0, V) { first[i] = -1; }
        _for(i, 1, E) {
          cin >> u >> v >> w;
          add(u, v, w);
          add(v, u, w);
        }
        int start, _end;
        cin >> start >> _end;
        spfa(start);
        if (dis[_end] < inf)
          cout << dis[_end] << endl;
        else
          cout << "-1" << endl;
      }
      return 0;
    }

     vector存储:

    #include <stdio.h>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #include <deque>
    #include <iomanip>
    #include <iostream>
    #include <list>
    #include <map>
    #include <queue>
    #include <set>
    #include <utility>
    #include <vector>
    #define mem(arr, num) memset(arr, 0, sizeof(arr))
    #define _for(i, a, b) for (int i = a; i <= b; i++)
    #define __for(i, a, b) for (int i = a; i >= b; i--)
    #define IO                     
      ios::sync_with_stdio(false); 
      cin.tie(0);                  
      cout.tie(0);
    using namespace std;
    typedef long long ll;
    const ll INFL = 0x3f3f3f3f3f3f3f3f;
    const int INF = 0x3f3f3f3f;
    const double EPS = 1e-6;
    const ll mod = 1000000007LL;
    const int N = 200 + 5;
    const int MAXN = 1 << 17;
    int dis[N], vis[N];
    int V, E;
    int num = 1;
    struct edge{
    
      int point, value;
      edge() {}
      edge(int _p,int _v) {point = _p, value = _v;}
    };
    vector <edge> e[N];
    void spfa(int st) {
      for (int i = 0; i <= V; i++) dis[i] = INF;
      dis[st] = 0;
      vis[st] = 1;
      queue<int> q;
      q.push(st);
      while (!q.empty()) {
        int v = q.front();
        q.pop();
        vis[v] = 0;
        vector <edge> :: iterator itor = e[v].begin();
        for( ; itor != e[v].end(); itor++) {
          if(dis[(*itor).point] > dis[v] + (*itor).value) {
            dis[(*itor).point] = dis[v] + (*itor).value;
            if(!vis[(*itor).point]) vis[(*itor).point] = 1, q.push((*itor).point);
          }
        }
        /*for(int i = 0; i < e[v].size(); i++) {
          if(dis[e[v][i].point] > dis[v] + e[v][i].value) {
            dis[e[v][i].point] = dis[v] + e[v][i].value;
            if(!vis[e[v][i].point]) vis[e[v][i].point] = 1, q.push(e[v][i].point);
          }
        }*/
      }
    }
    int main() {
      while (~scanf("%d%d",&V,&E)) {
        num = 1;
        mem(vis, 0);
        int u, v, w;
        _for(i, 0, V) { e[i].clear(); }
        _for(i, 1, E) {
          scanf("%d%d%d",&u,&v,&w);
          e[u].push_back(edge(v,w));
          e[v].push_back(edge(u,w));
        }
       int st, ed;
        cin >> st >> ed;
        spfa(st);
        if (dis[ed] < INF)
          cout << dis[ed] << endl;
        else
          cout << "-1" << endl;
      }
      return 0;
    }
    宝剑锋从磨砺出 梅花香自苦寒来
  • 相关阅读:
    windows中dos命令指南
    HDU 2084 数塔 (dp)
    HDU 1176 免费馅饼 (dp)
    HDU 1004 Let the Balloon Rise (map)
    变态杀人狂 (数学)
    HDU 2717 Catch That Cow (深搜)
    HDU 1234 开门人和关门人 (模拟)
    HDU 1070 Milk (模拟)
    HDU 1175 连连看 (深搜+剪枝)
    HDU 1159 Common Subsequence (dp)
  • 原文地址:https://www.cnblogs.com/GHzcx/p/8858618.html
Copyright © 2011-2022 走看看