题意: (欧洲人自己写的题面就是不一样啊...各种吐槽...果断还是看晕了)

有向图, 有个源叫CCS, 求从CCS到其他所有点的最短路之和, 以及从其他所有点到CCS的最短路之和.

思路:

返回的时候是多个源,但是因为终点只有一个,所以把所有边反向之后, 再SPFA一次源即可.

#include<cstdio>
#include<vector>
#include<queue>
const int MAXN=1000000+10;
typedef long long ll;
const ll inf=1e60;
using namespace std;
struct Node{
int v,w;
};
vector<Node>mp1[MAXN];//正向建图
vector<Node>mp2[MAXN];//反向建图
int n,m;
ll cost[MAXN]; void SPFA(int u,vector<Node>mp[]){
for(int i=2;i<=n;i++)cost[i]=inf;
cost[1]=0;
queue<int>Q;
Q.push(u);
while(!Q.empty()){
int u=Q.front();
Q.pop();
for(int i=0;i<mp[u].size();i++){
int v=mp[u][i].v;
int w=mp[u][i].w;
if(cost[v]>cost[u]+w){
cost[v]=cost[u]+w;
Q.push(v);
}
}
}
} int main(){
int _case;
scanf("%d",&_case);
while(_case--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
mp1[i].clear();
mp2[i].clear();
}
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
Node p1,p2;
p1.v=u,p2.v=v,p1.w=p2.w=w;
mp1[u].push_back(p2);
mp2[v].push_back(p1);
}
SPFA(1,mp1);//正向求一次
ll ans=0;
for(int i=2;i<=n;i++){
ans+=cost[i];
}
SPFA(1,mp2);//反向求一次
for(int i=2;i<=n;i++){
ans+=cost[i];
}
printf("%lld\n",ans);
}
return 0;
}

自己敲一遍:

#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
typedef long long ll;
const int MAXN = 1e6+5;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
typedef struct node
{
int v,w;
node(){}
node(int _v, int _w):v(_v),w(_w){}
}node; int n,m;
bool inq[MAXN];
ll cost[MAXN];
vector<node> g1[MAXN],g2[MAXN]; ll SPFA(int op)
{
memset(cost,0x3f,sizeof(cost));
memset(inq,false,sizeof(inq));
cost[1] = 0;
queue<int> q;
q.push(1);
inq[1] = true;
while(!q.empty())
{
int now = q.front();q.pop();
inq[now] = false;
for(int i=0,v,w;i<((op==1)?g1[now].size():g2[now].size());i++)
{
if(op==1)
{
v = g1[now][i].v, w = g1[now][i].w;
}
else
{
v = g2[now][i].v, w = g2[now][i].w;
}
if(cost[v] > cost[now] + w)
{
cost[v] = cost[now] + w;
if(!inq[v])
{
q.push(v);
inq[v] = true;
}
}
}
}
ll ret = 0;
for(int i=2;i<=n;i++)
ret += cost[i];
return ret;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
g1[i].clear();
g2[i].clear();
}
for(int i=0,u,v,w;i<m;i++)
{
scanf("%d %d %d",&u,&v,&w);
g1[u].push_back(node(v,w));
g2[v].push_back(node(u,w));
}
ll ans = 0;
ans += SPFA(1);
ans += SPFA(2);
printf("%d\n",(int)ans);
}
}

[HDU 1535]Invitation Cards[SPFA反向思维]的更多相关文章

  1. hdu 1535 Invitation Cards(SPFA)

    Invitation Cards Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other) T ...

  2. HDU 1535 Invitation Cards(SPFA,及其优化)

    题意: 有编号1-P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接到达终点站,是单向的,每条路线有它自己的车费. 有P个人早上从1出发,他们要到达每一个公交站点, 然后到了晚上再返回点1. ...

  3. HDU 1535 Invitation Cards(最短路 spfa)

    题目链接: 传送门 Invitation Cards Time Limit: 5000MS     Memory Limit: 32768 K Description In the age of te ...

  4. HDU - 1535 Invitation Cards 前向星SPFA

    Invitation Cards In the age of television, not many people attend theater performances. Antique Come ...

  5. hdu 1535 Invitation Cards(spfa)

    Invitation Cards Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  6. HDU 1535 Invitation Cards(逆向思维+邻接表+优先队列的Dijkstra算法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1535 Problem Description In the age of television, n ...

  7. hdu 1535 Invitation Cards (最短路径)

    Invitation Cards Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  8. HDU 1535 Invitation Cards (最短路)

    题目链接 Problem Description In the age of television, not many people attend theater performances. Anti ...

  9. HDU 1535 Invitation Cards (POJ 1511)

    两次SPFA. 求 来 和 回 的最短路之和. 用Dijkstra+邻接矩阵确实好写+方便交换.可是这个有1000000个点.矩阵开不了. d1[]为 1~N 的最短路. 将全部边的 邻点 交换. d ...

随机推荐

  1. android AsyncTask 详细例子(2)

    超时处理 001 import java.util.Timer; 002 import java.util.TimerTask; 003   004 import android.app.Activi ...

  2. Android动态加载jar/dex

    前言 在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优 ...

  3. ASE中的主要数据库

    Adaptive Server包括多种类型数据库: 必需数据库. “附加功能”数据库 .例子数据库 .应用数据库 1.必需数据库 master 数据库包含系统表,这些系统表中存储的数据被用来管理,有 ...

  4. Jquery与DOM对象

    在第一次学习jquery中,常常会不能分辨DOM对象和Jquery对象,下面我们就简诉一下它们之间的关系和区别 1.DOM对象(Document Object Model) 文档对象模型,每一份DOM ...

  5. Angular单页应用&AngularJS内部实现原理

    回顾 自定义指令 登录后获取登录信息session 首先在登录验证的时候保存一个user 在学生管理页面中运用ajax调用获取到登录的用户信息 对注销按钮添加点击事件:调用ajax在表现层给user赋 ...

  6. mvc actionresult 判断是否回发?

    if(Request.HttpMethod.Equals("POST", StringComparison.OrdinalIgnoreCase)){POST回发的代码}

  7. Asp.net mvc4 + HighCharts + 柱状图

    前端代码: @{ Layout = null;} <!DOCTYPE html> <html><head> <meta name="viewport ...

  8. C# string的一些函数

    创建string: string (char[])      使用指定的字符串数组构建一个新的string对象 Copy(string) 使用指定的string构建一个新的string对象 比较函数: ...

  9. javaWeb RSA加密使用

      加密算法在各个网站运用很平常,今天整理代码的时候看到了我们项目中运用了RSA加密,就了解了一下. 先简单说一下RSA加密算法原理,RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但 ...

  10. hdu 1282 回文数猜想

    Problem Description 一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数.任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其 ...