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;
}

 

posted @ 2018-04-16 21:17  GHzz  阅读(113)  评论(0编辑  收藏  举报