题目链接

题意 : 给你两个城市让你求最短距离,如果两个城市位于同一强连通分量中那距离为0.

思路 :强连通分量缩点之后,求最短路。以前写过,总感觉记忆不深,这次自己敲完再写了一遍。

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#define maxn 505
using namespace std ; struct node
{
int u,v,w,next ;
} edge[maxn*maxn];
int p[maxn][maxn];
int dfn[maxn],low[maxn],head[maxn] ,vis[maxn],dis[maxn],belong[maxn];
int timee,cnt ,cntt,n,m;
stack<int>stk ; void Init()
{
timee = ;
cnt = cntt = ;
memset(dfn,,sizeof(dfn)) ;
memset(low,,sizeof(low)) ;
memset(dis,,sizeof(dis)) ;
memset(head,-,sizeof(head)) ;
memset(vis,,sizeof(vis)) ;
memset(p,0x3f,sizeof(p)) ;
}
void addedge(int u,int v,int w)
{
edge[cnt].u = u ;
edge[cnt].v = v ;
edge[cnt].w = w ;
edge[cnt].next = head[u] ;
head[u] = cnt++ ;
}
void tarjan(int u)
{
//cout<<u<<endl;
int v ;
vis[u] = ;
dfn[u] = low[u] = ++ timee ;
stk.push(u) ;
for(int i = head[u] ; i != - ; i = edge[i].next)
{
v = edge[i].v ;
if(!dfn[v])
{
//printf("v = %d\n",v) ;
tarjan(v) ;
low[u] = min(low[v],low[u]) ;
}
else if(vis[v])
low[u] = min(low[u],dfn[v]) ;
}
if(low[u] == dfn[u])
{
cntt ++ ;
do
{
v = stk.top() ;
stk.pop() ;
vis[v] = ;
belong [v] = cntt ;
// puts("1") ;
}
while(v != u) ;
}
}
void SPFA(int u,int v)
{
queue<int>Q ;
for(int i = ; i <= cntt ; i++)
{
dis[i] = ;
vis[i] = ;
}
dis[u] = ;
vis[u] = ;
Q.push(u) ;
while(!Q.empty())
{
int s = Q.front() ;
Q.pop() ;
vis[s] = ;
for(int i = ; i <= n ; i ++ )
{
if(p[s][i] != )
{
if(dis[i] > dis[s] + p[s][i])
{
dis[i] = dis[s] + p[s][i] ;
if(!vis[i])
{
Q.push(i) ;
vis[i] = ;
}
}
}
}
}
if(dis[v] != )
printf("%d\n",dis[v]) ;
else printf("Nao e possivel entregar a carta\n") ;
}
void rebuild()
{
for(int i = ; i <= n ; i++)
{
for(int j = head[i] ; j != - ; j = edge[j].next)
{
// int s = edge[i].v ;
int v = belong[edge[j].v] ;
int u = belong[edge[j].u] ;
if(u != v)
p[u][v] = min(p[u][v],edge[j].w) ;
}
}
for(int i = ; i <= cntt ; i++)
p[i][i] = ;
}
int main()
{
int x,y,h,k;
while(~scanf("%d %d",&n,&m))
{
if(n == && m == ) break ;
Init() ;
for(int i = ; i < m ; i++)
{
scanf("%d %d %d",&x,&y,&h) ;
addedge(x,y,h) ;
}
for(int i = ; i <= n ; i++)
{
if(!dfn[i])
tarjan(i) ;
}
// cout<<"s"<<endl;
rebuild() ;
// cout<<"s"<<endl;
scanf("%d",&k) ;
for(int i = ; i < k ; i++)
{
//cout<<i<<endl;
scanf("%d %d",&x,&y) ;
SPFA(belong[x],belong[y]) ;
}
printf("\n") ;
}
return ;
}

POJ 3114 Countries in War(强联通分量+Tarjan)的更多相关文章

  1. POJ 3592 Instantaneous Transference(强联通分量 Tarjan)

    http://poj.org/problem?id=3592 题意 :给你一个n*m的矩阵,每个位置上都有一个字符,如果是数字代表这个地方有该数量的金矿,如果是*代表这个地方有传送带并且没有金矿,可以 ...

  2. POJ 3114 Countries in War(强连通+最短路)

    POJ 3114 Countries in War 题目链接 题意:给定一个有向图.强连通分支内传送不须要花费,其它有一定花费.每次询问两点的最小花费 思路:强连通缩点后求最短路就可以 代码: #in ...

  3. POJ 2186 Popular cows(Kosaraju+强联通分量模板)

    题目链接:http://poj.org/problem?id=2186 题目大意:给定N头牛和M个有序对(A,B),(A,B)表示A牛认为B牛是红人,该关系具有传递性,如果牛A认为牛B是红人,牛B认为 ...

  4. POJ 1904 King's Quest 强联通分量+输入输出外挂

    题意:国王有n个儿子,现在这n个儿子要在n个女孩里选择自己喜欢的,有的儿子可能喜欢多个,最后国王的向导给出他一个匹配.匹配有n个数,代表某个儿子和哪个女孩可以结婚.已知这些条件,要你找出每个儿子可以和 ...

  5. 强联通分量-tarjan算法

    定义:在一张有向图中,两个点可以相互到达,则称这两个点强连通:一张有向图上任意两个点可以相互到达,则称这张图为强连通图:非强连通图有极大的强连通子图,成为强联通分量. 如图,{1},{6}分别是一个强 ...

  6. [vios1023]维多利亚的舞会3<强联通分量tarjan>

    题目链接:https://vijos.org/p/1023 最近在练强联通分量,当然学的是tarjan算法 而这一道题虽然打着难度为3,且是tarjan算法的裸题出没在vijos里面 但其实并不是纯粹 ...

  7. POJ 3114 Countries in War(强连通)(缩点)(最短路)

                                    Countries in War Time Limit: 1000MS   Memory Limit: 65536K Total Sub ...

  8. poj 3114 Countries in War

    http://poj.org/problem?id=3114 #include <cstdio> #include <cstring> #include <queue&g ...

  9. 有向图的强联通分量 Tarjan算法模板

    //白书 321页 #include<iostream> #include<cstdio> #include<cstring> #include<vector ...

随机推荐

  1. oracle 查看隐含参数脚本

    set linesize 132 column name format a30 column value format a25 select x.ksppinm name, y.ksppstvl va ...

  2. 深度理解依赖注入(Dependence Injection)

    前面的话:提到依赖注入,大家都会想到老马那篇经典的文章.其实,本文就是相当于对那篇文章的解读.所以,如果您对原文已经有了非常深刻的理解,完全不需要再看此文:但是,如果您和笔者一样,以前曾经看过,似乎看 ...

  3. Stream,Reader/Writer,Buffered的区别(2)

    Reader: Reader的子类: 1.BufferedReader: FileReader 没有提供读取文本行的功能,BufferedReader能够指定缓冲区大小,包装了read方法高效读取字符 ...

  4. hdu 1195 Open the Lock

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1195 Open the Lock Description Now an emergent task f ...

  5. [整理]Selector、shape详解

    Selector.shape详解(一) Selector的结构描述: <?xml version="1.0" encoding="utf-8"?> ...

  6. linux打开端口

    客户那边有台服务器同一个局域网中都无法访问,排除lamp环境问题,发现时服务器中的防火墙没有开启80端口.于是去网上搜索了一下,在脚本之家看到一种添加代码的方法  代码如下 复制代码 vi /etc/ ...

  7. 条款5:了解C++提供的默认函数

    当我们定义一个类时,如果没有声明任何函数,那么C++编译器会默认提供4个函数:默认构造函数.复制构造函数.赋值操作符函数.析构函数,并且这些函数默认都是public且inline的.因此,当你定义如下 ...

  8. C++设计模式——工厂方法模式

    本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.» 本文链接:http://www.jellythink.com/arch ...

  9. mysql几个命令

    1.格式化输出 select * from mysql.user\G 2.显示版本 show version() 3.显示引擎 show engines mysql> show engines; ...

  10. Ztree的初步使用--checkbox--指定目录下搜索子节点

    这里记录一下zTree的check的使用 首先 <%@ Page Language="C#" AutoEventWireup="true" CodeBeh ...