题目链接

题意 : 给你两个城市让你求最短距离,如果两个城市位于同一强连通分量中那距离为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. 关于asp.net和iis的进程/线程问题,假如网站有1000个人访问,会产生多少个进程/线程啊

    详解 ASP.NET异步   超好的文章

  2. CSS3设置字体

    @font-face{ font-family: myFirstFont;src: url('Sansation_Light.ttf')   ,url('Sansation_Light.eot'); ...

  3. 关于开始学习Leetcode的第一帖

    从明天开始,白天在实验室完成工作,晚上来图书馆换个环境去学习算法数据结构等计算机基础性的技能.在LeetCode这个平台上做题. 现在感觉自己在算法和数据机构这方面实在是太薄弱了,需要慢慢的捡起来来, ...

  4. 009--VS2013 C++ 显示位图部分透明化

    其实这个更简单,只是把上一编文章的半透明化的代码去掉就可以啦 还是原来那张图片: //全局变量HBITMAP bg, girl;HDC mdc;//起始坐标const int xstart = 50; ...

  5. FPGA保留信号的语句

    (*synthesis,keep*) (*synthesis,probe_port,keep *) 例:(*synthesis,probe_port,keep *) wire e; 可用于wire型和 ...

  6. < java.util >-- Iterator接口

    每一个集合都有自己的数据结构,都有特定的取出自己内部元素的方式.为了便于操作所有的容器,取出元素.将容器内部的取出方式按照一个统一的规则向外提供,这个规则就是Iterator接口. 也就说,只要通过该 ...

  7. javascript面向对象分层思维

    js本身不是面向对象语言,在我们实际开发中其实很少用到面向对象思想,以前一直以为当要复用的时候才封装成对象,然而随着现在做的项目都后期测试阶段发现面向对象的作用不仅仅只是复用,可能你们会说面向对象还有 ...

  8. linux下在某行的前一行或后一行添加内容

    linux的sed工具是十分强大的,能很容易的实现在某关键词的前一行或后一行增加内容.今天在批量修改tomcat的日志时就用到了该功能. 一.在某行的前一行或后一行添加内容 具休操作如下: #匹配行前 ...

  9. Django RequestContext用法

    模版中的变量由context中的值来替换,如果在多个页面模版中含有相同的变量,比如:每个页面都需要{{user}},笨办法就是在每个页面的请求视图中都把user放到context中.   from d ...

  10. 图片上传前的预览(PHP)

    1.先创建一个file表单域,我们需要用它来浏览本地文件.<form name="form1" id="form1" method="post& ...