题目大意:

给定一些城市,然后再给一些寄信的路信,A,B,H代表把信从A城市寄到B城市需要H小时。

如果没有直接可以寄达的,可以先通过另外一个城市到达,比如A,B可以寄信,B,C可以寄信,那么,A,C也可以寄信。

其中两个城市之间如果可以相互寄信的话,那么这两个城市是属于一个国家的,寄信可以通过电子邮件,所以所需的时间为0.

题目中有K个询问,输入A,B询问A到B之间寄信最少需要多少时间

题目分析:

先求出强联通然后构图求最短路。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue>
usingnamespace std;
#define INF 0x7ffffff
#define maxn 510
typedef longlong LL;
#define Min(a,b) (a<b?a:b)
#define MOD 1000000007
int m, n, Time, top, ans;
int Stack[maxn], dfn[maxn], low[maxn], blocks[maxn];
bool InStack[maxn];
typedef struct node
{
int e, w;
node(int e=,int w=): e(e), w(w) {}
}node;
vector<vector<node> > G;
vector<vector<node> > G2; void init()
{
memset(dfn, , sizeof(dfn));
memset(low, , sizeof(low));
ans = Time = top = ;
G.clear();
G.resize(n+);
G2.clear();
G2.resize(n+);
} void Spfa()
{
} void Tarjan(int u)
{
low[u] = dfn[u] = ++Time;
Stack[top ++] = u;
InStack[u] = true;
int len = G[u].size();
node v;
for(int i=; i<len; i++)
{
v = G[u][i]; if( !low[v.e] )
{
Tarjan(v.e);
low[u] = min(low[u], low[v.e]);
}
elseif(InStack[v.e])
low[u] = min(low[u], dfn[v.e]);
}
int k;
if(dfn[u] == low[u])
{
do
{
k = Stack[--top];
InStack[k] = false;
blocks[k] = ans;
}while(u != k);
ans ++;
}
}
int Spfa(int Star,int End)
{
int dist[maxn];
bool vis[maxn];
memset(vis, false, sizeof(vis));
for(int i=; i<ans; i++)
dist[i] = INF;
dist[Star] = ;
queue<node> Q;
node P, Pn;
Q.push(node( Star,) ); while( Q.size() )
{
P = Q.front();
Q.pop();
vis[P.e] = true;
int len = G2[P.e].size(); for(int i=; i<len; i++)
{
Pn = G2[P.e][i];
if(dist[Pn.e] > dist[P.e] + Pn.w)
{
dist[Pn.e] = dist[P.e] + Pn.w;
if(!vis[Pn.e])
Q.push(Pn.e);
}
}
} // for(int i=0; i<ans; i++)
// printf("----%d\n", dist[i]);return dist[End];
} void solve()
{
int k, a, b;
for(int i=; i<=n; i++)
{
if(!low[i])
Tarjan(i);
} for(int i=; i <= n; i++)
{
int len = G[i].size();
node v;
for(int j=; j<len; j++)
{
v = G[i][j];
a = blocks[i], b = blocks[v.e]; if(a != b)
{
G2[a].push_back(node(b,v.w) );
// printf("%d->%d,%d\n",a, b, v.w); } }
}
scanf("%d",&k); while(k --)
{
scanf("%d %d",&a, &b);
a = blocks[a], b = blocks[b];
int rel = Spfa(a,b);
if(rel == INF)
puts("Nao e possivel entregar a carta");
else
printf("%d\n", rel);
}
printf("\n");
} int main()
{
while(scanf("%d %d",&n, &m), m+n)
{
init();
while(m--)
{
int a, b, c;
scanf("%d %d %d",&a, &b, &c);
G[a].push_back( node(b,c) );
}
solve();
}
return0;
}

POJ Countries in War 3114的更多相关文章

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

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

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

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

  3. poj 3114 Countries in War

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

  4. Countries in War -POJ3114Tarjan缩点+SPFA

    Countries in War Time Limit: 1000MS Memory Limit: 65536K Description In the year 2050, after differe ...

  5. Countries in War(强连通分量及其缩点)

    http://poj.org/problem?id=3114 题意:有n个城市,m条边,由a城市到b城市的通信时间为w,若a城市与b城市连通,b城市与a城市也连通,则a,b城市之间的通信时间为0,求出 ...

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

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

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

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

  8. poj 1085 Triangle War (状压+记忆化搜索)

    Triangle War Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2685   Accepted: 1061 Desc ...

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

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

随机推荐

  1. Block之变量作用域

    在使用block的过程中经常会调用不同类型.不同作用域的变量,如果对这些变量作用域的理解稍有偏差,就会出现问题.故此特意整理出block中会经常使用到的几种变量,如有补充,欢迎指出. 1. 局部变量 ...

  2. 在Linux下用netstat查看网络状态、端口状态

    在Linux下用netstat查看网络状态.端口状态 在linux一般使用netstat 来查看系统端口使用情况步. netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表.实 ...

  3. Java方法-数组

    [Java数组] 1. 用sort()方法对Java数组进行排序,及如何使用 binarySearch() 方法来查找数组中的元素 binarySearch() 返回值: 如果它包含在数组中,则返回搜 ...

  4. java 生成pdf报表

    public void saveMapAddressInfo(String orderCode){ try{ List<Leads> leadses = leadsService.find ...

  5. MongoDB_1

    突然想去看下MongoDB的东西,于是有了这篇文章.其实很早以前就看过一些关于NoSql的文章,还记得当时里面有介绍MongoDB的,多瞅了2眼,并且在Window下安装了MongoDB的驱动,小玩了 ...

  6. Deep Learning 学习随记(七)Convolution and Pooling --卷积和池化

    图像大小与参数个数: 前面几章都是针对小图像块处理的,这一章则是针对大图像进行处理的.两者在这的区别还是很明显的,小图像(如8*8,MINIST的28*28)可以采用全连接的方式(即输入层和隐含层直接 ...

  7. OC - 30.如何封装自定义布局

    概述 对于经常使用的控件或类,通常将其分装为一个单独的类来供外界使用,以此达到事半功倍的效果 由于分装的类不依赖于其他的类,所以若要使用该类,可直接将该类拖进项目文件即可 在进行分装的时候,通常需要用 ...

  8. 【POJ2752】【KMP】Seek the Name, Seek the Fame

    Description The little cat is so famous, that many couples tramp over hill and dale to Byteland, and ...

  9. 行列的几种命名方式.line-.colume======.row-.col=========.tr-.td

    第一种从line-height的语义来来讲,line表示hang再贴切不过了,colume纵列或者柱子也很形象,缺点太长了 第二种组合模拟rowspan,colspan而来,想必这个col也是colu ...

  10. 前端,移动开发者,UI须懂: 不同设备的之间的尺寸

    在开发前端,移动APP,以及设计UI的时候,我们经常会去搜索不同设备之间的尺寸,来开始自己的工作,以保证显示效果达到更好,这里收集了现在常用的设备. 设备更新速度快,有些没罗列的,大家可以谷歌或者百度 ...