题目链接

题意 : 给你两个城市让你求最短距离,如果两个城市位于同一强连通分量中那距离为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. RTP、RTCP

    http://blog.chinaunix.net/uid-22670933-id-1771676.html

  2. 在线调试js工具网站

    http://jsfiddle.net/gh/get/jquery/1.9.1/highslide-software/highcharts.com/tree/master/samples/highch ...

  3. HTML a 标签 下载 apk 文件

    代码:   <a href="http://www.abc2016.com/phone_Client/shouji.apk" class="download_inp ...

  4. 24.task的运用

    任务就是一段封装在“task-endtask”之间的程序.任务是通过调用来执行的,而且只有在调用时才执行,如果定义了任务,但是在整个过程中都没有调用它,那么这个任务是不会执行的.调用某个任务时可能需要 ...

  5. CoolShell Puzzle攻略[更新隐藏剧情]

    CoolShell博主陈皓做了一个在线的puzzle很有意思,链接在这里,这里记录一下解题的一些步骤. Puzzle 0 ++++++++[>+>++>+++>++++> ...

  6. 转载 SQL Server 2008 R2 事务与隔离级别实例讲解

    原文:http://blog.itpub.net/13651903/viewspace-1082730/ 一.事务简介 SQL Server的6个隔离级别中有5个是用于隔离事务的,它们因而被称作事务隔 ...

  7. 远航1617团队alpha版本分数分配与人员调动

    一.根据项目开始初期的分数分配要求及项目发布后大家的讨论,我们对组内成员的分数分配如下: 刘昊岩 20.5 周  萱 20.0 林谋武 19.0 杨  帆 18.5 高小洲 21.0 谢勤政 21.5 ...

  8. C#开源系统大汇总(转)

    一.AOP框架        Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种 ...

  9. IE点击tif,tiff文件,提示打开而不是查找

    IE点击tif或者tiff后缀的文件,提示窗口没有显示打开,而是现实查找.而下载到本地后,又能用acdsee之类的软件双击打开.在tif文件右键-属性中选择了打开程序,在IE中还是依然. 搜索网络资料 ...

  10. 或许你不知道:ArrayList

    ArrayList 底层以一个transient 线性数组来存储数据,它提供了无参构造方法,和有参构造方法,用户可以通过有参构造方法来初始化长度.如果不传参数,则默认调用无参构造器,数组默认长度为10 ...