题意:
      给你n个点,m条有向边,q询问,每次询问给两个数a,b输出a->b的最短路,但是题目有个限制,就是在一个环上的任意两点距离为0.

思路:
      简单题目,直接强连通压缩点,之后一遍spfa就行了。

#include<stack>
#include<queue>
#include<stdio.h>
#include<string.h>

#define N_node 500 + 5
#define N_edge 500 * 500 + 50
#define INF 1000000000

using namespace std;

typedef struct
{
    int to ,next ,cost;
}STAR;

typedef struct
{
    int a ,b ,c;
}EDGE;

STAR E1[N_edge] ,E2[N_edge];
EDGE E[N_edge];
int list1[N_node] ,list2[N_node] ,tot;
int Belong[N_node] ,s_x[N_node] ,cont;
int mark[N_node];
stack<int>sk;

void add(int a ,int b ,int c)
{
    E1[++tot].to = b;
    E1[tot].cost = c;
    E1[tot].next = list1[a];
    list1[a] = tot;

E2[tot].to = a;
    E2[tot].cost = c;
    E2[tot].next = list2[b];
    list2[b] = tot;
}

void DFS1(int s)
{
    mark[s] = 1;
    for(int k = list1[s] ;k ;k = E1[k].next)
    {
        int to = E1[k].to;
        if(!mark[to]) DFS1(to);
    }
    sk.push(s);
}

void DFS2(int s)
{
    mark[s] = 1;
    Belong[s] = cont;
    for(int k = list2[s] ;k ;k = E2[k].next)
    {
        int to = E2[k].to;
        if(!mark[to]) DFS2(to);
    }
}

void Spfa(int s ,int n)
{
    memset(mark ,0 ,sizeof(mark));
    for(int i = 0 ;i <= n ;i ++)
    s_x[i] = INF;
    queue<int>q;
    q.push(s);
    mark[s] = 1;
    s_x[s] = 0;
    while(!q.empty())
    {
        int xin ,tou;
        tou = q.front();
        q.pop();
        mark[tou] = 0;
        for(int k = list1[tou] ;k ;k = E1[k].next)
        {
            xin = E1[k].to;
            if(s_x[xin] > s_x[tou] + E1[k].cost)
            {
                s_x[xin] = s_x[tou] + E1[k].cost;
                if(!mark[xin])
                {
                    mark[xin] = 1;
                    q.push(xin);
                }
            }
        }
    }
}

int main ()
{
    int n ,m, q;
    while(~scanf("%d %d" ,&n ,&m) && n + m)
    {
        memset(list1 ,0 ,sizeof(list1));
        memset(list2 ,0 ,sizeof(list2));
        tot = 1;
        for(int i = 1 ;i <= m ;i ++)
        {
            scanf("%d %d %d" ,&E[i].a ,&E[i].b ,&E[i].c);
            add(E[i].a ,E[i].b ,E[i].c);
        }
        while(!sk.empty()) sk.pop();
        memset(mark ,0 ,sizeof(mark));
        for(int i = 1 ;i <= n ;i ++)
        if(!mark[i]) DFS1(i);
        memset(mark ,0 ,sizeof(mark));
        cont = 0;
        while(!sk.empty())
        {
            int i = sk.top();
            sk.pop();
            if(mark[i])continue;
            ++cont;
            DFS2(i);
        }
        //printf("%d****\n" ,cont);
        memset(list1 ,0 ,sizeof(list1));
        memset(list2 ,0 ,sizeof(list2));
        tot = 1;
        for(int i = 1 ;i <= m ;i ++)
        {
            int a ,b ,c;
            a = E[i].a ,b = E[i].b ,c = E[i].c;
            if(Belong[a] == Belong[b])continue;
            add(Belong[a] ,Belong[b] ,c);
        }
        scanf("%d" ,&q);
        while(q--)
        {
            int a ,b;
            scanf("%d %d" ,&a ,&b);
            if(Belong[a] == Belong[b]) printf("0\n");
            else
            {
                Spfa(Belong[a] ,cont);
                int sx = s_x[Belong[b]];
                if(sx == INF) printf("Nao e possivel entregar a carta\n");
                else printf("%d\n" ,sx);
            } 
        }printf("\n");
    }
    return 0;
}

POJ3114强连通+spfa相关推荐

  1. POJ3160强连通+spfa最长路(不错)

    题意:       给你一个有向图,每个点上有一个权值,可正可负,然后给你一些链接关系,让你找到一个起点,从起点开始走,走过的边可以在走,但是拿过权值的点就不能再拿了,问最多能拿到多少权值? 思路: ...

  2. 【图论专题】有向图的强连通分量

    整理的算法模板合集: ACM模板 题目列表: 题目 算法 A.AcWing 1174. 受欢迎的牛 缩点 B.AcWing 367. 学校网络 缩点 C.AcWing 1175. 最大半连通子图 ta ...

  3. 2019ICPC(银川) - Delivery Route(强连通缩点+分块最短路)

    题目链接:点击查看 题目大意:给出n个点和m条边构成的图,每条边都有权值,其中m1条边是双向的,且权值非负,有m2条边是单向的,且权值可负,现在要求从给定起点st到其他每个点的最短路,若不存在路径则输 ...

  4. BZOJ1179 Atm //缩点+spfa

    1179: [Apio2009]Atm Description Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的 ...

  5. Wikioi 2822爱在心中(强连通缩点+dfs)

    2822 爱在心中(强连通缩点+遍历) 2822 爱在心中 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description " ...

  6. 【强连通分量·Tarjan】bzoj1179: [Apio2009]Atm

    新博的第一发! 因为这几天切了几道强连通分量,所以从这里begin [题目描述] Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个Siruseri ...

  7. 队爷的讲学计划 (强连通缩点+最短路)

    队爷的讲学计划 [问题描述] 队爷为了造福社会,准备到各地去讲学.他的计划中有n个城市,从u到v可能有一条单向道路,通过这条道路所需费用为q.当队爷在u城市讲学完之后,u城市会派出一名使者与他同行,只 ...

  8. 图论总结(欧拉路+Floyd所有结点最短+Bellman-Ford算法+SPFA+Dijsktra算法+Tarjan算法+最小生成树(prim+kruskal) )

    目录 欧拉路 判断欧拉路是否存在: ​​​​​​​ 最短路: Floyd算法 : ​​​​​​​​​​​​​​ Bellman-Ford: ​​​​​​​ Dijkstra 单源最短路 先附上例题: ...

  9. 【差分约束系统】【强连通分量缩点】【拓扑排序】【DAG最短路】CDOJ1638 红藕香残玉簟秋,轻解罗裳,独上兰舟。...

    题意: 给定n个点(点权未知)和m条信息:u的权值>=v的权值+w 求点权的极小解和极大解(无解则输出-1) 极小解即每个点的点权可能的最小值 极大解即每个点的点权可能的最大值 题解: 差分约束 ...

最新文章

  1. 读书笔记 - 《21世纪的管理挑战》
  2. 第六周实践作业:软件测试和评估
  3. 来自艾斯维尔的计算机科学系的期刊排行,研究生必备!
  4. 我学员的一个问题及其我对之的解答,关于lr返回值问题
  5. 【☀️Linux什么姿势最舒服?简单讲讲☀️】嵌入式Linux入门
  6. html模块化标签,jq load()方法实现html 模块化。
  7. 阿里P8架构师谈:分布式、集群、负载均衡、分布式数据一致性的区别与关联
  8. Web前端期末大作业--重工机械设备检测生产企业官网网页设计(HTML+CSS+JavaScript )实现
  9. PowerEdge服务器生命周期控制器:Lifecycle Controller
  10. Leetcode刷题指南和top100题目
  11. python将一个word文档中内容全部复制,添加到另一个word文档末
  12. 求最小公倍数的三种方法
  13. Ansys多核仿真报错解决办法
  14. Kong的插件:Rate Limiting
  15. iOS 【使用自定义字体-苹方字体】
  16. AT89C51(Atmel)芯片制作简易的频率计
  17. 量子信息-学习记录13
  18. 此公众号并没有这些scope的权限 错误码10005
  19. 大数据精细化运营产品解决方案
  20. 中国联通物联卡ICCID号码查询原理

热门文章

  1. ubuntu下配置eclipse3.3
  2. click和blur 冲突???
  3. Windows 曝漏洞 —— 影响所有版本
  4. 与 Linux 一起学习:学习地理
  5. OpenMP并行化实例----Mandelbrot集合并行化计算
  6. java基础知识总结,绝对经典
  7. linux tunnel 与cisco 三层交换机的tunnel互联
  8. 【C#食谱】【杭帮菜】菜单2:写一个TCP客户端
  9. C# 对象深拷贝、浅铐贝、直接拷贝(转)
  10. 站长常用广告代码的表达大全