http://poj.org/problem?id=3114

 #include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#define maxn 300000
using namespace std; const int inf=<<;
int head[maxn],head1[maxn],dfn[maxn],low[maxn],belong[maxn],stack1[maxn],dis[maxn],cnt[maxn];
int e,ee,bcc_clock,bcnt,top,N,E,x,y,h,k,o,d;
bool vis[maxn],visi[maxn]; struct node
{
int u,v,w,next;
}p[maxn]; struct node1
{
int u,v,w,next;
}pp[maxn]; void add(int u,int v,int w)
{
p[e].u=u;
p[e].v=v;
p[e].w=w;
p[e].next=head[u];
head[u]=e++;
} void addnode(int u,int v,int w)
{
pp[ee].u=u;pp[ee].v=v;
pp[ee].w=w;
pp[ee].next=head1[u];
head1[u]=ee++;
} void tarjan(int u)
{
vis[u]=true;
dfn[u]=low[u]=++bcc_clock;
stack1[++top]=u;
for(int i=head[u]; i!=-; i=p[i].next)
{
int v=p[i].v;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])
{
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u])
{
bcnt++;
int j;
do
{
j=stack1[top--];
vis[j]=false;
belong[j]=bcnt;
}while(j!=u);
}
} void deal()
{
bcc_clock=,bcnt=,top=;
memset(vis,false,sizeof(vis));
memset(belong,,sizeof(belong));
memset(dfn,,sizeof(dfn));
for(int i=; i<=N; i++)
{
if(!dfn[i])
{
tarjan(i);
}
}
} void inti()
{
memset(head,-,sizeof(head));
memset(head1,-,sizeof(head1));
e=,ee=;
}
bool ralex(int u,int v,int w)
{
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
return true;
}
return false;
} bool spfa(int src)
{
memset(visi,false,sizeof(visi));
memset(cnt,,sizeof(cnt));
queue<int>q;
for(int i=; i<=N; i++)
{
dis[i]=inf;
}
dis[src]=;
visi[src]=true;
q.push(src);
while(!q.empty())
{
int u=q.front();q.pop();
visi[u]=false;
for(int i=head1[u]; i!=-; i=pp[i].next)
{
if(ralex(u,pp[i].v,pp[i].w)&&!visi[pp[i].v])
{
if((++cnt[pp[i].v])>N) return false;
visi[pp[i].v]=true;
q.push(pp[i].v);
}
}
}
return true;
} int main()
{
while(scanf("%d%d",&N,&E)!=EOF)
{
inti();
if(N==&&E==) break;
for(int i=; i<E; i++)
{
scanf("%d%d%d",&x,&y,&h);
add(x,y,h);
}
deal();
for(int i=; i<=N; i++)
{
for(int j=head[i]; j!=-; j=p[j].next)
{
int v=p[j].v;
if(belong[i]==belong[v]) addnode(i,v,);
else if(belong[i]!=belong[v]) addnode(i,v,p[j].w);
}
}
scanf("%d",&k);
for(int i=; i<k; i++)
{
scanf("%d%d",&o,&d);
spfa(o);
if(dis[d]!=inf)
printf("%d\n",dis[d]);
else
printf("Nao e possivel entregar a carta\n");
}
printf("\n");
}
return ;
}

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

  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(强联通分量+Tarjan)

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

  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 (POJ 3114) Tarjan缩点+最短路

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

  6. POJ Countries in War 3114

    题目大意: 给定一些城市,然后再给一些寄信的路信,A,B,H代表把信从A城市寄到B城市需要H小时. 如果没有直接可以寄达的,可以先通过另外一个城市到达,比如A,B可以寄信,B,C可以寄信,那么,A,C ...

  7. poj 3114(强连通缩点+SPFA)

    题目链接:http://poj.org/problem?id=3114 思路:题目要求很简单,就是求两点之间的花费的最短时间,不过有一个要求:如果这两个city属于同一个国家,则花费时间为0.如何判断 ...

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

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

  9. 随机算法 poj 2576 Tug of War

    Tug of War Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 8187   Accepted: 2204 Descri ...

随机推荐

  1. 在树莓派1B上编译安装lnmp服务器

    最近一周给部门内部搭建考试系统,选择使用PHPEMS.这是个开源的系统,唯一缺点是PHP的版本比较低,只能使用5.2或5.3.而我的树莓派系统更新后使用apt-get安装得到的PHP版本为5.4.由于 ...

  2. SRM 207 Div II Level Two: RegularSeason,字符串操作(sstream),多关键字排序(操作符重载)

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=2866&rd=5853 主要是要对字符串的操作要熟悉,熟 ...

  3. android EditText中的inputType

    android 1.5以后添加了软件虚拟键盘的功能,所以在输入提示中将会有对应的软键盘模式 android中inputType属性在EditText输入值时启动的虚拟键盘的风格有着重要的作用.这也大大 ...

  4. PHP开发安全之近墨者浅谈(转)

    ==过滤输入/输出转义 过滤是Web应用安全的基础.它是你验证数据合法性的过程.通过在输入时确认对所有的数据进行过滤,你可以避免被污染(未过滤)数据在你的程序中被误信及误用.大多数流行的PHP应用的漏 ...

  5. Linux驱动程序开发 - 设备控制接口

    (2008-08-08 15:02:19) 转载▼ 标签: it linux kernel driver 分类: Linux 序言设备驱动程序的一个基本功能就是管理和控制设备,同时为用户应用程序提供管 ...

  6. 【小TIP】记录各种错误【更新中】

    最好程序一遍通过,为了提高代码能力,这里将用TIP的形式记录来犯过的错误.不断更新中. *已经转移到闪存.. [150214]WA:检查是否数组开小了. [150212]WA:如果程序中有乘号,需要留 ...

  7. H.264视频在android手机端的解码与播放(转)

    随着无线网络和智能手机的发展,智能手机与人们日常生活联系越来越紧密,娱乐.商务应用.金融应用.交通出行各种功能的软件大批涌现,使得人们的生活丰富多彩.快捷便利,也让它成为人们生活中不可取代的一部分.其 ...

  8. 跳ajax方式进行前后台交互之后台代码要怎么写

    package com.zq.www.mis.action; import java.util.List; import org.apache.struts2.convention.annotatio ...

  9. asp.net基础概念总结

    1  什么是asp.net?asp.net是一种编程语言吗? asp.net是Microsoft公司推出的新一代建立动态web应用程序的开发平台,是一种建立动态web应用程序的新技术. 不是,asp. ...

  10. eclipse - 自动换行

    eclipse自动换行,设置的感觉不是很好用,可以从这个网址进行更新安装: http://ahtik.com/eclipse-update/