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;
    }
    宝剑锋从磨砺出 梅花香自苦寒来
  • 相关阅读:
    Soket 连接发送与接收
    Java socket 说明 以及web 出现java.net.SocketException:(Connection reset或者Connectreset by peer:Socket write error)的解释
    oralce 仅配置精简客户端 连接plsql ( 版本需一直,要不都是32要不是都是64)
    struts2令牌,防止重复提交
    hibernate 3.* C3P0配置 以及为什么需要连接池!
    struts2接收参数——域模型、DTO
    JavaScript 键盘event.keyCode值列表大全
    JS操作JSON总结
    JS中typeof与instanceof的区别
    js eval()函数 接收一个字符串,做为js代码来执行。 如: s='var d="kaka"'; 或者s=‘function (code){return code }’;
  • 原文地址:https://www.cnblogs.com/GHzcx/p/8858618.html
Copyright © 2011-2022 走看看