POJ 1511 Invitation Cards(单源最短路,优先队列优化的Dijkstra)

//============================================================================
// Name : POJ.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================ #include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
/*
* 使用优先队列优化Dijkstra算法
* 复杂度O(ElogE)
* 注意对vector<Edge>E[MAXN]进行初始化后加边
*/
const int INF=0x3f3f3f3f;
const int MAXN=1000010;
struct qnode
{
int v;
int c;
qnode(int _v=0,int _c=0):v(_v),c(_c){}
bool operator <(const qnode &r)const
{
return c>r.c;
}
};
struct Edge
{
int v,cost;
Edge(int _v=0,int _cost=0):v(_v),cost(_cost){}
};
vector<Edge>E[MAXN];
bool vis[MAXN];
int dist[MAXN];
void Dijkstra(int n,int start)//点的编号从1开始
{
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++)dist[i]=INF;
priority_queue<qnode>que;
while(!que.empty())que.pop();
dist[start]=0;
que.push(qnode(start,0));
qnode tmp;
while(!que.empty())
{
tmp=que.top();
que.pop();
int u=tmp.v;
if(vis[u])continue;
vis[u]=true;
for(int i=0;i<E[u].size();i++)
{
int v=E[tmp.v][i].v;
int cost=E[u][i].cost;
if(!vis[v]&&dist[v]>dist[u]+cost)
{
dist[v]=dist[u]+cost;
que.push(qnode(v,dist[v]));
}
}
}
}
void addedge(int u,int v,int w)
{
E[u].push_back(Edge(v,w));
}
int A[MAXN],B[MAXN],C[MAXN];
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int n,m;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
scanf("%d%d%d",&A[i],&B[i],&C[i]);
for(int i=1;i<=n;i++)E[i].clear();
for(int i=0;i<m;i++)addedge(A[i],B[i],C[i]);
Dijkstra(n,1);
long long ans=0;
for(int i=1;i<=n;i++)ans+=dist[i];
for(int i=1;i<=n;i++)E[i].clear();
for(int i=0;i<m;i++)addedge(B[i],A[i],C[i]);
Dijkstra(n,1);
for(int i=1;i<=n;i++)ans+=dist[i];
printf("%I64d\n",ans);
}
return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

最新文章

  1. Swift之控件-UIlabel
  2. (七)DAC0832 数模转换芯片的应用 以及运算放大器的学习 01
  3. Sublime Text3快捷方式与使用技巧
  4. rhel5 新建用户提示:the home directory already exists.
  5. 如何添加localizable.strings本地化
  6. linux更改shell
  7. bzoj1148
  8. mvc of js
  9. python中打印文件名,行号,路径
  10. HDU 1711 Number Sequence(算法验证)
  11. [TPYBoard-Micropython之会python就能做硬件 7] 学习使用蓝牙模块及舵机
  12. 把纯C的动态库代码改造成C++版的
  13. HTC Vive 基础入门 基于Unreal Engine 4引擎
  14. EF大数据批量处理 EntityFrameWork下增加扩展方法
  15. POJ 1679 The Unique MST(判断最小生成树是否唯一)
  16. 【转】 最新版chrome谷歌浏览器Ajax跨域调试问题
  17. 合格linux运维人员必会的30道shell编程面试题及讲解
  18. Linux可视化服务器管理工具webmin
  19. OC Copy基本使用(深拷贝和浅拷贝)
  20. Cookie 与 网络通信

热门文章

  1. 炼数成金数据分析课程---14、Logistic回归
  2. 关于类中的参数类型和return返回值
  3. java xmltojson jsontoxml
  4. Yslow压力测试
  5. Decision Tree、Random Forest、AdaBoost、GBDT
  6. drf中间件流程图
  7. 使用Swagger2Markup归档swagger生成的API文档
  8. (数据科学学习手札57)用ggplotly()美化ggplot2图像
  9. 关于tp验证码模块
  10. Windows跳板机无法共享本地主机剪贴板