题目链接

畅通工程,可以用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();                  \
  cout.tie();
using namespace std;
typedef long long ll;
const ll inf = 0x3f3f3f3f;
;
const ll mod = 1000000007LL;
 + ;
int mp[N][N], mp1[N][N];
int dis[N], vis[N];
int V, E;
void spfa(int start) {
  ; i <= V; i++) dis[i] = inf;
  dis[start] = ;
  vis[start] = ;
  queue<int> q;
  q.push(start);
  while (!q.empty()) {
    int v = q.front();
    q.pop();
    vis[v] = ;
    ; i <= mp1[v][]; i++) {
      if (dis[mp1[v][i]] > dis[v] + mp[v][mp1[v][i]]) {
        dis[mp1[v][i]] = dis[v] + mp[v][mp1[v][i]];
        ) q.push(mp1[v][i]), vis[mp1[v][i]] = ;
      }
    }
  }
}
int main() {
  int s, e, value;
  while (cin >> V >> E) {
    mem(mp,); mem(mp1,); mem(vis,);
    _for(i, , E) {
      cin >> s >> e >> value;
       && mp[s][e] < value) continue;
      mp1[s][]++;
      mp1[s][mp1[s][]] = e;
      mp[s][e] = value;  //记录mp度并且记录每个度的点的下标。
      mp1[e][]++;
      mp1[e][mp1[e][]] = 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;
  }
  ;
}

邻接表实现:

#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();                  \
  cout.tie();
using namespace std;
typedef long long ll;
const ll inf = 0x3f3f3f3f;
;
const ll mod = 1000000007LL;
 + ;
 << ;
int mp[N][N], mp1[N][N];
int dis[N], vis[N];
int V, E;
int first[N];
;
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) {
  ; i <= V; i++) dis[i] = inf;
  dis[start] = ;
  vis[start] = ;
  queue<int> q;
  q.push(start);
  while (!q.empty()) {
    int v = q.front();
    q.pop();
    vis[v] = ;
    ; tmp = e[tmp].next) {
      if (dis[e[tmp].point] > dis[v] + e[tmp].value) {
        dis[e[tmp].point] = dis[v] + e[tmp].value;
        , q.push(e[tmp].point);
      }
    }
  }
}
int main() {
  int s, e, value;
  while (cin >> V >> E) {
    num = ;
    mem(vis, );
    int u, v, w;
    _for(i, , V) { first[i] = -; }
    _for(i, , 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;
  }
  ;
}

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();                  \
  cout.tie();
using namespace std;
typedef long long ll;
const ll INFL = 0x3f3f3f3f3f3f3f3f;
const int INF = 0x3f3f3f3f;
;
const ll mod = 1000000007LL;
 + ;
 << ;
int dis[N], vis[N];
int V, E;
;
struct edge{

  int point, value;
  edge() {}
  edge(int _p,int _v) {point = _p, value = _v;}
};
vector <edge> e[N];
void spfa(int st) {
  ; i <= V; i++) dis[i] = INF;
  dis[st] = ;
  vis[st] = ;
  queue<int> q;
  q.push(st);
  while (!q.empty()) {
    int v = q.front();
    q.pop();
    vis[v] = ;
    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;
        , 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 = ;
    mem(vis, );
    int u, v, w;
    _for(i, , V) { e[i].clear(); }
    _for(i, , 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;
  }
  ;
}

hdu 1874 畅通工程(spfa 邻接矩阵 邻接表)的更多相关文章

  1. HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题

    参考 此题Dijkstra算法,一次AC.这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科): 附上:  迪科斯彻算法分解(优酷) problem link -> HDU 1874 ...

  2. ACM: HDU 1874 畅通工程续-Dijkstra算法

    HDU 1874 畅通工程续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Desc ...

  3. hdu 1874 畅通工程续

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过 ...

  4. HDU 1874畅通工程续(迪杰斯特拉算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others)     ...

  5. HDU 1874 畅通工程续(最短路/spfa Dijkstra 邻接矩阵+邻接表)

    题目链接: 传送门 畅通工程续 Time Limit: 1000MS     Memory Limit: 65536K Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路. ...

  6. HDU 1874 畅通工程续 SPFA || dijkstra||floyd

    http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目大意: 给你一些点,让你求S到T的最短路径. 我只是来练习一下SPFA的 dijkstra+邻接矩阵 ...

  7. HDU——1874畅通工程续(邻接矩阵弗洛伊德)

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  8. hdu 1874 畅通工程续(迪杰斯特拉优先队列,floyd,spfa)

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  9. HDU——1874畅通工程续(Dijkstra与SPFA)

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

随机推荐

  1. linux查看文件相关指令

    以下内容整理自以下两篇文章: http://www.cnblogs.com/xilifeng/archive/2012/10/13/2722596.html Linux 查看文件内容的命令 http: ...

  2. jquery禁用按钮

    $('#sub').click(function () { var self = $(this); ,'#01b637') ){ return false; } }); function onesho ...

  3. PowerDesigner16 设置导出sql文件的编码

    一: 导出数据库结构sql脚本 Database ->  Generate  Database 在弹窗中选择Format选项卡,修改Encoding,选择自己需要的编码格式. 二:比较数据库差异 ...

  4. Chrome浏览器启动页被360导航篡改解决方法

    右键Chrome浏览器快捷方式,选择“属性”,在“目标”的结尾处有添加的网址,删了即可. 2 如果在结尾处没有任何网址,可以添加“ -nohome”,这样下次启动时,就会打开一个空白页,也就不会打开被 ...

  5. bzoj 1406 数论

    首先问题的意思就是在找出n以内的所有x^2%n=1的数,那么我们可以得到(x+1)(x-1)=y*n,那么我们知道n|(x+1)(x-1),我们设n=a*b,那么我们对于任意的a,我们满足n%a==0 ...

  6. 【HNOI】 lct tree-dp

    [题目描述]给定2-3颗树,每个边的边权为1,解决以下独立的问题. 现在通过连接若干遍使得图为连通图,并且Σdis(x,y)最大,x,y只算一次. 每个点为黑点或者白点,现在需要删除一些边,使得图中的 ...

  7. webpack版本1与版本2的若干写法区别

    2.x的环境遇到类似this._init is not a function的报错. 版本1.x的写法: resolve: { extensions: ['', '.js', '.vue'] }, m ...

  8. Java垃圾收集算法

    算法名称 过程 优缺点 1. 标记-清除算法 (Mark-Sweep) 分为两个阶段: 1.首先标记出所有需要回收的对象: 2.在标记完成后统一回收所有被标记的对象. 缺点: 1.效率问题:标记和清除 ...

  9. android 内核调试

    这篇文档给出使用android emulator 和 arm-linux-androideabi-gdb 调试 android kernel 的方法 1. checkout goldfish 源码: ...

  10. Python Matplotlib图表汉字显示成框框的解决办法

    http://blog.sina.com.cn/s/blog_662dcb820102vu3d.html http://blog.csdn.net/fyuanfena/article/details/ ...