缩完点后对每次询问做dijkstra即可

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
#include<ctime>
#define pa pair<int,int>
#define LL long long int
using namespace std;
const int maxn=,maxm=; LL rd(){
LL x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Edge{
int a,b,l,ne;
}eg[maxm],eg2[maxm];
int egh[maxn],egh2[maxn],ect2,ect;
int N,M,K;
int dfn[maxn],low[maxn],bel[maxn],stk[maxn],tot,pct,sct;
int mp[maxn][maxn],dis[maxn];
bool instk[maxn]; inline void adeg(int a,int b,int l){
eg[ect].a=a;eg[ect].b=b;eg[ect].l=l;eg[ect].ne=egh[a];egh[a]=ect++;
}inline void adeg2(int a,int b,int l){
eg2[ect2].a=a;eg2[ect2].b=b;eg2[ect2].l=l;eg2[ect2].ne=egh2[a];egh2[a]=ect2++;
} void tarjan(int x){
dfn[x]=low[x]=++tot;
stk[++sct]=x;;instk[x]=;
for(int i=egh[x];i!=-;i=eg[i].ne){
int j=eg[i].b;
if(instk[j]) low[x]=min(low[x],dfn[j]);
else if(!dfn[j]){
tarjan(j);
low[x]=min(low[x],low[j]);
}
}if(low[x]==dfn[x]){
++pct;
while(sct){
instk[stk[sct]]=;
bel[stk[sct]]=pct;
if(stk[sct--]==x) break;
}
}
} int dijkstra(int s,int e){
memset(dis,,sizeof(dis));
priority_queue<pa,vector<pa>,greater<pa> > q;
dis[s]=;q.push(make_pair(,s));
while(!q.empty()){
int p=q.top().second;q.pop();
if(p==e) return dis[e];
for(int i=egh2[p];i!=-;i=eg2[i].ne){
int b=eg2[i].b;
if(dis[b]>dis[p]+eg2[i].l){
dis[b]=dis[p]+eg2[i].l;
q.push(make_pair(dis[b],b));
}
}
}return dis[e];
} int main(){
int i,j,k;
while(){
N=rd();if(!N) break;M=rd();
if(tot) printf("\n");
memset(egh,-,sizeof(egh));
memset(egh2,-,sizeof(egh2));
memset(dfn,,sizeof(dfn));
memset(instk,,sizeof(instk));
memset(mp,,sizeof(mp));
ect=ect2=tot=pct=sct=;
for(i=;i<=M;i++){
int a=rd(),b=rd(),c=rd();
adeg(a,b,c);
}for(i=;i<=N;i++) if(!dfn[i]) tarjan(i);
for(i=;i<ect;i++){
int a=bel[eg[i].a],b=bel[eg[i].b];
if(a==b) continue;
mp[a][b]=min(mp[a][b],eg[i].l);
}
for(i=;i<=pct;i++){
for(j=;j<=pct;j++){
if(mp[i][j]<=) adeg2(i,j,mp[i][j]);
}
}
for(K=rd();K;K--){
int a=rd(),b=rd();
i=dijkstra(bel[a],bel[b]);
if(i<=1e8) printf("%d\n",i);
else printf("Nao e possivel entregar a carta\n");
}
} }

poj3114 Contries in War (tarjan+dijkstra)的更多相关文章

  1. HDU 4005 The war Tarjan+dp

    The war Problem Description   In the war, the intelligence about the enemy is very important. Now, o ...

  2. luogu3953 [NOIp2017]逛公园 (tarjan+dijkstra+记忆化搜索)

    先跑一边dijkstra算出从1到i的最短距离dis[i] 然后建反向边 从n开始记忆化搜索,(p,k)表示1到p的距离=dis[p]+k的方案数 答案就是$\sum\limits_{i=0}^{k} ...

  3. POJ 3114 Tarjan+Dijkstra

    题意: 间谍在战争期间想要传递一份谍报回国,谍报可以在邮局之间传递,但这种传递是单向的,并且会少耗一些时间.但是如果两个邮局在同一个国家的话,那么谍报在这两个邮局之间传递是不消耗时间的.如果几个邮局发 ...

  4. POJ3114 Countries in War (强连通分量 + 缩点 + 最短路径 + 好题)

    题目链接 题意是说在几个邮局之间传送一份信件,如果出发点和终止点在同一个国家传递,则时间为0,否则让你求花费最少时间,如果不能传到,则输出Nao e possivel entregar a carta ...

  5. 图论_FatherChristmasFlymouse(Tarjan+dijkstra or spfa)

    堆优化Dij VS Spfa 堆优化Dij小胜一筹. 题目名字:Father Christmas flymouse (POJ 3160) 这题可以说是图论做的比较畅快的一题,比较综合,很想说一说. 首 ...

  6. 图论1 Tarjan算法

    强连通分量 模板(强联通分量个数+缩点) #include<iostream> #include<cstdio> #define MAXn 100000 #define MAX ...

  7. HDU 4005 The war (图论-tarjan)

    The war Problem Description In the war, the intelligence about the enemy is very important. Now, our ...

  8. POJ 3114 Countries in War(强联通分量+Tarjan)

    题目链接 题意 : 给你两个城市让你求最短距离,如果两个城市位于同一强连通分量中那距离为0. 思路 :强连通分量缩点之后,求最短路.以前写过,总感觉记忆不深,这次自己敲完再写了一遍. #include ...

  9. Countries in War (POJ 3114) Tarjan缩点+最短路

    题目大意: 在一个有向图中,每两点间通信需要一定的时间,但同一个强连通分量里传递信息不用时间,给两点u,v求他们最小的通信时间.   解题过程: 1.首先把强连通分量缩点,然后遍历每一条边来更新两个强 ...

随机推荐

  1. [Oracle]TM lock (DML enqueue) 的相容性

    [Oracle]TM lock (DML enqueue) 的相容性 RS(SS):  行共享     LMODE =2 RX(SX):  行独占     LMODE =3 S:       共享   ...

  2. [Python]Python 函数调用小例子

    函数定义: In [78]: def printme(str): ....: print str ....: return ....: 调用: In [79]: printme('This is Ji ...

  3. 【php增删改查实例】第十五节 - 用户管理模块(删除确认)

    假如有一天,用户找到你,说万一不小心手一抖,就点击了删除用户,不太好.能不能再误点的时候,再给个确认框,让用户进行二次确认. OK,用户是上帝.这边我们可以考虑用confirm方法进行开发. 参考代码 ...

  4. 2016年总结 - Java程序员

    一 . 技术积累 (1)代码规范 1.1.1.通常的模块分布:一般如果你要实现一个web应用,你从后台将数据展示到前端页面,在一个比较大的公司,你少不了跟其他项目有交集(你调用他的接口,他依赖你的接口 ...

  5. spring boot 集成Druid

    Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB ...

  6. 开源数据同步神器——canal

    前言 如今大型的IT系统中,都会使用分布式的方式,同时会有非常多的中间件,如redis.消息队列.大数据存储等,但是实际核心的数据存储依然是存储在数据库,作为使用最广泛的数据库,如何将mysql的数据 ...

  7. linux-shell-变量参数

    sxt1 的生命周期随着调起而生效,结束就消失 子进程和父进程的关系,

  8. linux-文件数据操作awk命令

    最后一列是:交互外壳 单引号里的内容不会被bash扩展 cut 同样可以做到 "\t" 制表符 cut 和 sed 结合同样可以实现 扩展:匿名方法可以有多个,and方法只能有一个 ...

  9. 复审Partner

    复审代码后,发现了一些问题: 首先说优点:代码十分工整,很清晰,各种类易于理解,逻辑上很通顺. 基本实现了代码功能,输出正确. 发现的缺点:对于文件后缀的识别有点问题,不能识别所需求的所有文件,只有一 ...

  10. Daily Scrumming* 2015.12.21(Day 13)

    一.团队scrum meeting照片 大部分成员编译请假,故今天没有开scrum meeting 二.成员工作总结 姓名 任务ID 迁入记录 江昊 无 无 任务说明: 今日准备编译测验,请假 遇到问 ...