交通运输线

原创 2017年08月20日 16:56:33

问题 A: 交通运输线

题目描述

战后有很多城市被严重破坏,我们需要重建城市。然而,有些建设材料只能在某些地方产生。因此,我们必须通过城市交通,来运送这些材料的城市。由于大部分道路已经在战争期间完全遭到破坏,可能有两个城市之间没有道路。当然在运输线中,更不可能存在圈。 
现在,你的任务来了。给你战后的道路情况,我们想知道,两个城市之间是否存在道路,如果存在,输出这两个城市之间的最短路径长度。 

输入

第一行一个整数Case(Case<=10)表示测试数据组数。 
每组测试数据第一行三个整数N,M和C (2<=N<=10, 000) (0<=M<10, 000) (1<=c<=1000000)共有N个城市,现存M条边,共有C对运输需求。 
接下来M行,每行三个整数A和B,D(1<=A,B<=N,A不等于B)表示从A到B有一条直接的公路,且距离为D。 
最后C行,每行两个整数,S和T(1<=S,T<=N,S不等于T),即询问从S到T的最短路径长度。 

输出

共Case行,否存在从S到T的路径,则输出最短路径,否则输出“Not connected”。

样例输入

1
5 3 2
1 3 2
2 4 3
5 2 3
1 4
4 5

样例输出

Not connected
6
    初看此题,便注意到了这句“当然在运输线中,更不可能存在圈。 ”,也就是说,该图是森林,对于任意两点,要么没有路径,要么
存在唯一路径,所以很容易便想到了树上LCA,而本人用的方法则是tarjan求公共祖先,对于在树上任意两点{u,v},设它们公共祖先
为p,dis[]表示这个点到这棵树树根的距离,于是有两点之间距离=dis[u]+dis[v]-2*dis[p],这个式子可以通过画一棵树很容易得出。
    调了一个多小时。。。哭晕,先是用边表,然而却出现RE和TL,然后改为邻接表,竟然AC了,我将两段代码都放在下面,如果有
路过的神犇可以帮我看看。
RE的代码(边表)
#include
#include
#define N1 10005
#define N2 1000005 
using namespace std;
int T,n,m,c,cnt,qcnt;
int f[100005],flag[N1],vis[N1],ans[N2],head[N1],next[N1],to[N1],len[N1],qhead[N2],qto[N2],qnext[N2],id[N2],dis[N1];
void init(){
	int i;
	for (i=1;i<=100000;i++) f[i]=i;
	memset(flag,0,sizeof(flag));
	memset(ans,-1,sizeof(ans));
	memset(head,0,sizeof(head));
	memset(to,0,sizeof(to));
	memset(len,0,sizeof(len));
	memset(qhead,0,sizeof(qhead));
	memset(qto,0,sizeof(qto));
	memset(id,0,sizeof(id));
	cnt=0;qcnt=0;
}
void addedge(int u,int v,int p){
	next[++cnt]=head[u];to[cnt]=v;len[cnt]=p;head[u]=cnt;
}
void addqedge(int u,int v,int p){
	qnext[++qcnt]=qhead[u];qto[qcnt]=v;id[qcnt]=p;qhead[u]=qcnt;
}
int find(int x){
	if (f[x]==x) return x;
	return f[x]=find(f[x]);
}
void tarjan(int u){
	vis[u]=1;
	flag[u]=1;
	int i;
	for (i=head[u];i!=0;i=next[i]){
		int v=to[i];
		if (!flag[v]){
			dis[v]=dis[u]+len[i];
			tarjan(v);
			f[v]=u;
		}
	}
	for (i=qhead[u];i!=0;i=qnext[i]){
		int v=qto[i],x=id[i];
		if (flag[v] && vis[v])
			ans[x]=dis[u]+dis[v]-2*dis[find(v)];
	}
}
int main(){
	scanf("%d",&T);
	while (T--){
		init();
		int i;
		scanf("%d%d%d",&n,&m,&c);
		for (i=1;i<=m;i++){
			int u,v,p;
			scanf("%d%d%d",&u,&v,&p);
			addedge(u,v,p);
			addedge(v,u,p);
		}
		for (i=1;i<=c;i++){
			int u,v;
			scanf("%d%d",&u,&v);
			addqedge(u,v,i);
			addqedge(v,u,i);
		}
		for (i=1;i<=n;i++){
			if (!flag[i]){
				dis[i]=0;
				memset(vis,0,sizeof(vis)); 
				tarjan(i);
			}
		}
		for (i=1;i<=c;i++){
			if (ans[i]==-1) 
				printf("Not connected\n");
			else
				printf("%d\n",ans[i]);
		}
	}
	return 0;
}
 AC的代码(邻接表)
#include
#include
#include
#define N1 10005
#define N2 100005
#define N3 1000005 
using namespace std;
int T,n,m,c;
int flag[N1],vis[N1],dis[N1],f[N2],ans[N3];
struct node1{
	int v,len;
};
struct node2{
	int v,id;
};
vector  edge[N1];
vector  qedge[N1];
void init(){
	int i;
	for (i=1;i<=100000;i++) f[i]=i;
	memset(flag,0,sizeof(flag));
	memset(ans,-1,sizeof(ans));
    for (i=1;i<=10000;i++){
    	edge[i].clear();
    	qedge[i].clear();
	}
}
int find(int x){
	if (f[x]==x) return x;
	return f[x]=find(f[x]);
}
void tarjan(int u){
	vis[u]=1;
	flag[u]=1;
	int i;
	for (i=0;i

java两个线程交替执行

这个问题的来源是一个题目:线程A循环10次,线程B循环100,接着又回到线程A循环10次,接着再回到线程B又循环100,如此循环50次。 一般来说线程锁可以用:synchronized、Lock。 ...
  • keitho00
  • keitho00
  • 2015年07月25日 20:58
  • 6711

交通运输中的算法与数据技术

使用仿真计算一般来研究物流,车流,规划三块。通常这个方向要深入两个方向:计算机方向与运筹学方向。 ITS(短时交通流)目前比较有价值的一个方向芝加哥大学教授Knuth Prize奖得主宣布一种“图同...
  • yunxinan
  • yunxinan
  • 2016年08月16日 17:57
  • 1571

Linux线程间数据交换——管道篇

参考资料 [1]linux 线程(FIFO)先进先出 [2]linux管道的那点事
  • Q1302182594
  • Q1302182594
  • 2015年07月12日 16:33
  • 1751

LCA 交通运输线 题目&题解&代码

题目描述 战后有很多城市被严重破坏,我们需要重建城市。然而,有些建设材料只能在某些地方产生。因此,我们必须通过城市交通,来运送这些材料的城市。由于大部分道路已经在战争期间完全遭到破坏,可能有两个城市...
  • Rainbow6174
  • Rainbow6174
  • 2015年07月23日 20:44
  • 427

三菱PLC皮条运输线

  • 2015年08月21日 13:41
  • 412KB
  • 下载

黑马程序员 交通灯管理系统

---------- android培训、java培训、期待与您交流! ----------
  • kubZhaiNan
  • kubZhaiNan
  • 2014年06月30日 01:07
  • 232

中兴智能交通公司总裁谈物联网“狼来了”

在物联网发展方向逐渐清晰的今天,中兴智能交通(无锡)有限公司作为传统智能交通企业,率先作出企业战略发展重大决策,将公司核心部门搬迁到无锡,未来重点发展物联网——智能交通,布局智能交通物联网。   ...
  • xqdd
  • xqdd
  • 2011年09月05日 00:30
  • 2280

BDTC 2017丨大数据在金融、交通、医疗、工业领域落地实践与应用

BDTC 2017中国大数据技术大会将于12月7日-9日在北京新云南皇冠假日酒店举行,大会为期三天。届时,近百位技术专家将为现场数千名的大数据行业精英、技术专家及意见领袖带来多场技术演讲,分享最新技术...
  • csdnsevenn
  • csdnsevenn
  • 2017年11月27日 00:00
  • 102

黑马程序员—13、JAVA面试题系列—交通灯管理系统

黑马程序员—13、JAVA面试题系列—交通灯管理系统 --------------------- android培训、java培训、期待与您交流! 1、交通灯管理系统的项目需求 ...
  • chenxingsheng_heima
  • chenxingsheng_heima
  • 2012年05月06日 17:57
  • 268

C++ MOOC 西安交通大学 中国大学生MOOC网 期末考试

C++MOOC 期末考试 西安交通大学 1. 行程编码(20分) 题目内容: 输入一段由英文字母组成的文字,将这段文字的前面一半逆序(当文字长度为奇数时,前一半的长度是stringlengt...
  • CooperNiu
  • CooperNiu
  • 2017年06月04日 10:34
  • 1180
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:交通运输线
举报原因:
原因补充:

(最多只允许输入30个字)