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 ...
随机推荐
- JAVA 原始国际化例子
import java.text.MessageFormat; import java.util.Locale; import java.util.ResourceBundle; public cla ...
- 关于一些Android冷知识
1. 在Android4.0以后,EditText就由以前的输入框变成了一条划线的输入方式,如需要变为老版本的,只需在layout里面引入代码: android:background="@a ...
- Eclipse从数据库逆向生成Hibernate带注解的实体类
http://www.2cto.com/database/201501/372023.html
- Java环境的安装与配置
Java环境的安装与配置 环境:Java8,win10 推荐oracle官网oracle官网https://www.oracle.com/index.html下载JDK进行安装 选择自己需要的版本下载 ...
- Java如何连接到MySQL数据库的
下载:mysql-connector-java-5.1.38.tar.gz http://dev.mysql.com/downloads/connector/j/ tar zxvf mysql-con ...
- c++实现的Array数据结构
1.Array.h,Array<T>的定义 template <class T> class Array { protected: T *data; //一个指向数组数据的指针 ...
- SGU 149. Computer Network
时间限制:0.25s 空间限制:4M: 题意: 给出一颗n(n<=10000)个节点的树,和n-1条边的长度.求出这棵树每个节点到最远节点的距离: Solution: 对于一个节点,我们可以用D ...
- CetnOS minimal 网络不可用
系统版本: CentOS-6.6-i386-minimal 问题说明: CentOS minimal 在安装完成之后,网络不可用,一些常见的命令报错,如: ping: unknow host xxxy ...
- Crystal Report制作使用
Crystal Report制作使用 本文主要划分为以下六部分: 一.Crystal Report for .NET 的功能 二.Crystal Report总体结构 三.报表数据访问执行模式 四.报 ...
- YII 小部件实现的注册表
今天来进行用户注册功能yii集成了很多验证框架,framework/validators下面,这个文件夹的最后一个文件CValidator.php 是总的验证信息,根据请求参数决定需要那种验证 如:u ...