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

有向图, 有个源叫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. maven 打包源文件

    1.The source plugin can be used to create a jar file of the project sources from the command line or ...

  2. [RxJS] Stopping a Stream with TakeUntil

    Observables often need to be stopped before they are completed. This lesson shows how to use takeUnt ...

  3. [Javascript] How to use JavaScript's String.replace

    In JavaScript, you can change the content of a string using the replace method. This method signatur ...

  4. Linux基础知识(二)

    1. 请回答,32位和64位有什么区别呢?什么时候安装32位的,又什么时候安装64位操作系统呢?如何查看系统是32位的还是64位的? 所谓的32位.64位指的是CPU的GPRs(General-Pur ...

  5. css布局详解(一)——盒模型

    一.网页布局的几种情况 今天让我们总结一下在css布局的各种情况做一个总结,为我们以后布局网页时做一个参考. 先看一张图,这是去年cssConf大会时阿里的 @寒冬winter 老师放出来的: 如图所 ...

  6. c# 取得扩展名

    string KZM=files[0].FileName.Substring(files[0].FileName.LastIndexOf(".") + 1);

  7. ajax传递json数据,springmvc后台就收json数据

    1.ajax数据的封装 var json = {"token":token};//封装json数据 $.ajax({ url:'', data:JSON.stringify(jso ...

  8. OC基础 可变数组与不可变数组的使用

    OC基础 可变数组与不可变数组的使用 1.不可变数组 1.1不可变数组的创建 //实例方法 NSArray *array = [[NSArray alloc] initWithObjects:&quo ...

  9. 点击推送消息跳转处理(iOS)

    当用户点击收到的推送消息时候,我希望打开APP,并且跳转到对应的界面,这就需要在AppDelegate里面对代理方法进行处理. 当用户点击推送消息打开APP的时候会调用 - (BOOL)applica ...

  10. lightoj 1236 正整数唯一分解定理

    A - (例题)整数分解 Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:32768KB     6 ...