题目链接

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

    系统:Ubuntu 10.04 JDK:jdk-6u20-linux-i586.bin 当然,我已经在sun的官方网站上下载好了必要的jdk,由于是在linux下安装,跟平时习惯的windows有所不 ...

  2. mysql存储过程执行权限问题

    tags: mysql  PROCEDURE 存储过程 definer SECURITY 权限 以下存储过程,限定了DEFINER为root,也就是root之外的账户是无法调用这个存储过程的. 1 2 ...

  3. 【EF Code First】 一对一、一对多的多重关系配置

    这里使用相册Album和图片Picture的关系做示例 1,Album与Picture最基本的关系是1-n(一个相册可以有多张图片) 这时Album.Picture实体类可以这么定义 /// < ...

  4. java字符串替换函数高效实现

    public static String removeStr(String src, String str) { if (src == null || str == null) return src; ...

  5. java并发编程:如何创建线程

    原文:http://www.cnblogs.com/dolphin0520/p/3913517.html 一.Java中关于应用程序和进程相关的概念 在Java中,一个应用程序对应着一个JVM实例(也 ...

  6. android listview和button,ImageButton等有事件的控件的总结

    public ImageButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defSty ...

  7. MyEclipse运行很慢的原因

    myEclipse以其丰富的功能博得程序员的热爱,但是其速度确实有问题,jsp文 件打开会不停的校验,甚至出现卡死,分析原因,原来是 validation在做怪. 好,既然找到了原因,那就把问题解决, ...

  8. android 通过AlarmManager实现守护进程

    场景:在app崩溃或手动退出或静默安装后能够自动重启应用activity 前提:得到系统签名 platform.pk8.platform.x509.pem及signapk.jar 三个文件缺一不可(系 ...

  9. Rich Text Editor for MVC

    在网站开发中难免会用到富文本编辑器,本文将介绍一款富文本编辑器(在线HTML编辑器) Rich Text Editor ,简要说明一下其在MVC中的使用. 具体使用情况和下载地址请参考:http:// ...

  10. 二分图匹配(KM算法)n^4 分类: ACM TYPE 2014-10-04 11:36 88人阅读 评论(0) 收藏

    #include <iostream> #include<cstring> #include<cstdio> #include<cmath> #incl ...