Connections between cities

Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 896 Accepted Submission(s): 236
 
Problem Description
After World War X, a lot of cities have been seriously damaged, and we need to rebuild those cities. However, some materials needed can only be produced in certain places. So we need to transport these materials from city to city. For most of roads had been totally destroyed during the war, there might be no path between two cities, no circle exists as well.
Now, your task comes. After giving you the condition of the roads, we want to know if there exists a path between any two cities. If the answer is yes, output the shortest path between them.
 
Input
Input consists of multiple problem instances.For each instance, first line contains three integers n, m and c, 2<=n<=10000, 0<=m<10000, 1<=c<=1000000. n represents the number of cities numbered from 1 to n. Following m lines, each line has three integers i, j and k, represent a road between city i and city j, with length k. Last c lines, two integers i, j each line, indicates a query of city i and city j.
 
Output
            For each problem instance, one line for each query. If no path between two cities, output “Not connected”, otherwise output the length of the shortest path between them.
 
Sample Input
5 3 2
1 3 2
2 4 3
5 2 3
1 4
4 5
 
Sample Output
Not connected
6
Hint

Hint Huge input, scanf recommended.

 
 
Source
2009 Multi-University Training Contest 8 - Host by BJNU
 
Recommend
gaojie
 
/*
用vector炸了,还是用邻接表卡过的
*/
#include<bits/stdc++.h>
using namespace std;
#define M 10007
#define N 2222212
int bin[M],dis[M],vis[M],cur[N],root[M];
int s1[N],s2[N],t[N],d[N],p[N];
int n,m,ne,cnt; int find(int x)
{
while(x!=bin[x])
x=bin[x];
return x;
} void add(int u,int v,int w,int h[])
{
t[ne]=v,d[ne]=w,p[ne]=h[u],h[u]=ne++;
t[ne]=u,d[ne]=w,p[ne]=h[v],h[v]=ne++;
}
/*
LCA算法以某一个节点作为根节点,开始遍历,遍历到一个结点先判断与它相关的结点是不是有已经被访问过的,
如果有的话,判断两个结点是不是在同一棵树上,如果是的话就保留最近公共祖先的距离,如果不是的话,就是不能到达,距离就赋值为-1 */
void LCA(int u)
{
root[u]=cnt;
bin[u]=u;
vis[u]=;
//遍历查询树
for(int i=s2[u];i;i=p[i])
{
int v=t[i];
if(vis[v])
{
if(root[u]==root[v])//在同一棵树下
{
int rt=find(v);//最近公共祖先
cur[d[i]]=dis[u]+dis[v]-*dis[rt];
}
else
cur[d[i]]=-;
} }
//遍历城市图
for(int i=s1[u];i;i=p[i])
{
int v=t[i];
if(!vis[v])
{
dis[v]=dis[u]+d[i];
LCA(v);
bin[v]=u;//路径压缩
}
}
} int main()
{
//freopen("C:\\Users\\acer\\Desktop\\in.txt","r",stdin);
int n,m,q,i,j;
while(scanf("%d%d%d",&n,&m,&q)!=EOF)
{
for(i=,ne=;i<=n;i++)
{
s1[i]=s2[i]=vis[i]=cur[i]=root[i]=bin[i]=;
}
int u,v,w;
for(i=;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w,s1);
}
for(i=;i<=q;i++)
{
scanf("%d%d",&u,&v);
add(u,v,i,s2);
}
for(i=,cnt=;i<=n;i++,cnt++)
if(!vis[i])
{
dis[i]=;
LCA(i);
} for(i=;i<=q;i++)
if(cur[i]>=)
printf("%d\n",cur[i]);
else
printf("Not connected\n");
}
return ;
}
#include<bits/stdc++.h>
#define N 10005
using namespace std;
int n,m,c;
int bin[N];
int root[N];//表示点i的根节点
int roo;//表示当前是以哪个结点为根节点遍历的
int dis[N];//标记结点i到根结点的距离
int vis[N];//标记i点是否被访问过
int cur[N];//表示第几组解
int op[N][N];//表示解是第几组
struct node
{
int v,val;
node(){}
node(int a,int b)
{
v=a;
val=b;
}
};
vector<node>edge[N];
vector<node>edg[N];
int findx(int x)
{
while(x!=bin[x])
x=bin[x];
return x;
}
/*
Tarjan算法以某一个节点作为根节点,开始遍历,遍历到一个结点先判断与它相关的结点是不是有已经被访问过的,
如果有的话,判断两个结点是不是在同一棵树上,如果是的话就保留最近公共祖先的距离,如果不是的话,就是不能到达,距离就赋值为-1 */
int LCA(int u)
{
//首先遍历查询树
root[u]=roo;
vis[u]=;
bin[u]=u;
for(int i=;i<edg[u].size();i++)
{
int nex=edg[u][i].v;
if(vis[nex]==)//这个点遍历过了
{
if(root[u]==root[nex])
{
int rt=findx(nex);
cur[op[u][nex]]=dis[u]+dis[nex]-*dis[rt];//
}
else
cur[op[u][nex]]=-;
}
}
//然后就是遍历程城市树
for(int i=;i<edge[u].size();i++)
{
int nex=edge[u][i].v;
if(vis[nex]) continue;
dis[nex]=dis[u]+edge[u][i].val;//父节点到根节点的距离,加上到父节点的距离
LCA(nex);
bin[nex]=u;//路径压缩
}
}
int x,y,val;
void inti()
{
for(int i=;i<=n;i++)
{
edge[i].clear();
edg[i].clear();
bin[i]=i;
cur[i]=-;
dis[i]=;
vis[i]=;
}
}
int main()
{
//freopen("C:\\Users\\acer\\Desktop\\in.txt","r",stdin);
while(scanf("%d%d%d",&n,&m,&c)!=EOF)
{
inti();
//构建城市的图
for(int i=;i<m;i++)
{
scanf("%d%d%d",&x,&y,&val);
edge[x].push_back(node(y,val));
edge[y].push_back(node(x,val));
}
//构建查询树
for(int i=;i<c;i++)
{
scanf("%d%d",&x,&y);
op[x][y]=op[y][x]=i;
edg[x].push_back(node(y,));
edg[y].push_back(node(x,));
}
for(int i=;i<=n;i++)
{
if(!vis[i])
{
roo=i;
dis[i]=;
LCA(i);
}
}
for(int i=;i<c;i++)
{
if(cur[i]==-)
puts("Not connected");
else
printf("%d\n",cur[i]);
}
}
return ;
}

Connections between cities的更多相关文章

  1. hdu 2874 Connections between cities [LCA] (lca->rmq)

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  2. HDU 2874 Connections between cities(LCA Tarjan)

    Connections between cities [题目链接]Connections between cities [题目类型]LCA Tarjan &题意: 输入一个森林,总节点不超过N ...

  3. hdu 2874 Connections between cities 带权lca判是否联通

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  4. hdu 2874 Connections between cities(st&rmq LCA)

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  5. hdu 2874 Connections between cities (并查集+LCA)

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  6. hdu-2874 Connections between cities(lca+tarjan+并查集)

    题目链接: Connections between cities Time Limit: 10000/5000 MS (Java/Others)     Memory Limit: 32768/327 ...

  7. HDU 2874 Connections between cities(LCA)

    题目链接 Connections between cities LCA的模板题啦. #include <bits/stdc++.h> using namespace std; #defin ...

  8. HDU——2874 Connections between cities

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  9. Connections between cities LCA

    Problem Description After World War X, a lot of cities have been seriously damaged, and we need to r ...

随机推荐

  1. Hello PyQt5

    在 ubuntu 系统上 GUI 编程,PyQt5 是个不错的选择.首先,当然是安装 PyQt5 了.终端输入命令: pip3 install PyQt5 即可. 1. 建立一目录 x01.PyQtH ...

  2. AFN默认请求和响应的处理

       1.默认的响应的解析      1.1 AFN默认不支持接受text/html数据类型,只需要增加即可     manager.responseSerializer.acceptableCont ...

  3. 第4章 同步控制 Synchronization ----事件(Event Objects)

    Win32 中最具弹性的同步机制就属 events 对象了.Event 对象是一种核心对象,它的唯一目的就是成为激发状态或未激发状态.这两种状态全由程序来控制,不会成为 Wait...() 函数的副作 ...

  4. js中的||与&&用法

    &&和||在JQuery源代码内尤为使用广泛,由网上找了些例子作为参考,对其用法研究了一下: &&: function a(){ alert("a" ...

  5. django ajax练习

    这几天遇到了django ajax请求出错的问题,总结一下 前端js:我这里创建的是一个字典格式的数据,前端js收到字典之后也是要用字典的形式去解包后台传送过来的数据,比如我下面的写法:data['s ...

  6. ubuntu访问文件服务器

    随便打开一个文件夹,按ctrl+L 输入 smb://172.29.17.1 然后输入用户名和密码即可

  7. 设置MySQL最大连接数

    <pre name="code" class="sql">在使用MySQL数据库的时候,经常会遇到这么一个问题,就是"Can not co ...

  8. WPF第三方控件Telerik

    帮助文档:http://www.telerik.com/help/wpf/gridview-selection-via-checkbox.html Telerik专注于微软.Net平台的表示层与内容管 ...

  9. 【框架学习与探究之消息队列--EasyNetQ(2)】

    声明 本文欢迎转载,系博主原创,本文原始链接地址:http://www.cnblogs.com/DjlNet/p/7654902.html 前言 此文章,是承接上篇:[框架学习与探究之消息队列--Ea ...

  10. 第八章 关于SQL查询出错的一些问题

    问题一:在使用MySQL使用传参查询并返回结果集时,没错,小伙伴们都知道少不了Statement接口和PreparedStatement对象.问题来了,有时竟然查询不了,Debug进去,发现执行的SQ ...