POJ Countries in War 3114
题目大意:
给定一些城市,然后再给一些寄信的路信,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的更多相关文章
- POJ 3114 Countries in War(强连通+最短路)
POJ 3114 Countries in War 题目链接 题意:给定一个有向图.强连通分支内传送不须要花费,其它有一定花费.每次询问两点的最小花费 思路:强连通缩点后求最短路就可以 代码: #in ...
- POJ 3114 Countries in War(强连通)(缩点)(最短路)
Countries in War Time Limit: 1000MS Memory Limit: 65536K Total Sub ...
- poj 3114 Countries in War
http://poj.org/problem?id=3114 #include <cstdio> #include <cstring> #include <queue&g ...
- Countries in War -POJ3114Tarjan缩点+SPFA
Countries in War Time Limit: 1000MS Memory Limit: 65536K Description In the year 2050, after differe ...
- Countries in War(强连通分量及其缩点)
http://poj.org/problem?id=3114 题意:有n个城市,m条边,由a城市到b城市的通信时间为w,若a城市与b城市连通,b城市与a城市也连通,则a,b城市之间的通信时间为0,求出 ...
- Countries in War (POJ 3114) Tarjan缩点+最短路
题目大意: 在一个有向图中,每两点间通信需要一定的时间,但同一个强连通分量里传递信息不用时间,给两点u,v求他们最小的通信时间. 解题过程: 1.首先把强连通分量缩点,然后遍历每一条边来更新两个强 ...
- POJ 3114 Countries in War(强联通分量+Tarjan)
题目链接 题意 : 给你两个城市让你求最短距离,如果两个城市位于同一强连通分量中那距离为0. 思路 :强连通分量缩点之后,求最短路.以前写过,总感觉记忆不深,这次自己敲完再写了一遍. #include ...
- poj 1085 Triangle War (状压+记忆化搜索)
Triangle War Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2685 Accepted: 1061 Desc ...
- POJ3114 Countries in War (强连通分量 + 缩点 + 最短路径 + 好题)
题目链接 题意是说在几个邮局之间传送一份信件,如果出发点和终止点在同一个国家传递,则时间为0,否则让你求花费最少时间,如果不能传到,则输出Nao e possivel entregar a carta ...
随机推荐
- Block之变量作用域
在使用block的过程中经常会调用不同类型.不同作用域的变量,如果对这些变量作用域的理解稍有偏差,就会出现问题.故此特意整理出block中会经常使用到的几种变量,如有补充,欢迎指出. 1. 局部变量 ...
- 在Linux下用netstat查看网络状态、端口状态
在Linux下用netstat查看网络状态.端口状态 在linux一般使用netstat 来查看系统端口使用情况步. netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表.实 ...
- Java方法-数组
[Java数组] 1. 用sort()方法对Java数组进行排序,及如何使用 binarySearch() 方法来查找数组中的元素 binarySearch() 返回值: 如果它包含在数组中,则返回搜 ...
- java 生成pdf报表
public void saveMapAddressInfo(String orderCode){ try{ List<Leads> leadses = leadsService.find ...
- MongoDB_1
突然想去看下MongoDB的东西,于是有了这篇文章.其实很早以前就看过一些关于NoSql的文章,还记得当时里面有介绍MongoDB的,多瞅了2眼,并且在Window下安装了MongoDB的驱动,小玩了 ...
- Deep Learning 学习随记(七)Convolution and Pooling --卷积和池化
图像大小与参数个数: 前面几章都是针对小图像块处理的,这一章则是针对大图像进行处理的.两者在这的区别还是很明显的,小图像(如8*8,MINIST的28*28)可以采用全连接的方式(即输入层和隐含层直接 ...
- OC - 30.如何封装自定义布局
概述 对于经常使用的控件或类,通常将其分装为一个单独的类来供外界使用,以此达到事半功倍的效果 由于分装的类不依赖于其他的类,所以若要使用该类,可直接将该类拖进项目文件即可 在进行分装的时候,通常需要用 ...
- 【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 ...
- 行列的几种命名方式.line-.colume======.row-.col=========.tr-.td
第一种从line-height的语义来来讲,line表示hang再贴切不过了,colume纵列或者柱子也很形象,缺点太长了 第二种组合模拟rowspan,colspan而来,想必这个col也是colu ...
- 前端,移动开发者,UI须懂: 不同设备的之间的尺寸
在开发前端,移动APP,以及设计UI的时候,我们经常会去搜索不同设备之间的尺寸,来开始自己的工作,以保证显示效果达到更好,这里收集了现在常用的设备. 设备更新速度快,有些没罗列的,大家可以谷歌或者百度 ...