数据结构与算法实验题 7.1 M 商人的求救

原创 2013年12月05日 12:25:51
问题描述:
A 国正面临着一场残酷的战争,城市被支持不同领导的两股势力占据,作为一个商人,M先生并不太关心政治,但是他知道局势很严重,他希望你能救他出去。M 先生说:“为了安全起见,我们的路线最多只能包含一条连接两股不同势力城市的道路”。M 先生想知道最快多久能到达目的地。
数据输入:
第一行 N(2<=N<=600),代表城市个数。第二行 M(0<=M<=10000),代表道路条数。接 下 来 M 行 每 行 三 个 数 A,B,T 。 代 表 一 条 从 城 市 A 到 城 市 B 的 路 需 要 耗 时
T(1<=T<=1500)。接下来一行 N 个数,这些数只会是 1 或者 2,第 i 个数字代表第 i 个城市属于第几股势力。
为了简化问题,我们假设开始时 M 先生在城市 1,目的地是城市 2,城市 1 属于第 1 股势力,城市 2 属于第 2 股势力。道路是双向的。数据保证没有重边。
结果输出:

输出最少需要的时间。如果无法到达则输出-1。

输入示例:
2
1
1 2 100
1 2

3
3
1 2 100
1 3 40
2 3 50
1 2 1

5
5
3 1 200
5 3 150
2 5 160
4 3 170
4 2 170
1 2 2 2 1

输出示例:

100

90

540




“我们的路线最多只能包含一条连接两股不同势力城市的道路”故只能找到到到达某个城市后再到城市2最短路径。

代码12/17上传

---------------

先找出城市1到势力1所有节点的最短路径,城市2到势力2所有点的最短路径。

然后枚举从1到某个城市,再从这个城市到2的最短路。

#include<cstdio>
const int MAXN=600+5;
const int INF=999999;
int force[MAXN];
int map[MAXN][MAXN];
int dis[3][MAXN],n;
void Dijkstra(int kind)
{
	int cur=kind;
	bool vis[MAXN]={0};
	vis[cur]=true;
	dis[kind][cur]=0;

	int i,j;
	for(i=1;i<=n;i++)
	{
		int mini=INF;
		for(j=1;j<=n;j++)
			if(map[cur][j]!=INF && force[j]==kind && map[cur][j] + dis[kind][cur] < dis[kind][j] )
				dis[kind][j]=map[cur][j] + dis[kind][cur];

		for(j=1;j<=n;j++)
			if(!vis[j] && dis[kind][j] < mini)
				mini=dis[kind][cur=j];

		vis[cur]=true;
	}
}

int main()
{
	int i,j;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			map[i][j]=INF;

	int m;
	scanf("%d",&m);

	for(i=0;i<m;i++)
	{
		int a,b,t;
		scanf("%d%d%d",&a,&b,&t);
		map[a][b]=map[b][a]=t;
	}

	for(i=1;i<=n;i++)
	{	
		scanf("%d",&force[i]);
		dis[1][i]=dis[2][i]=INF;
	}

	Dijkstra(1);
	Dijkstra(2);

	int ans=map[1][2],temp;
	for(j=1;j<=n;j++)
	{
		for(i=1;i<=n;i++)
		{
			if(force[i]!=force[j])
			{
				temp=map[i][j] + dis[1][j] + dis[2][i];
				if(temp<ans)
					ans=temp;
			}
		}
	}


	if(ans!=INF)
		printf("%d\n",ans);
	else
		printf("-1\n");

	return 0;
}


数据结构与算法实验题-大招秒杀

数据结构与算法实验题-大招秒杀 ★实验任务 众所周知,兽王萨尔有一招技能叫闪电链,可以跳跃电击敌人。现在,萨尔为了迅速对敌,强行把自己闪电链升级成了大招(英雄还能自己改大招?这个设定有点假啊。。。)。...
  • murmured
  • murmured
  • 2013年11月28日 12:57
  • 1394

算法与数据结构实验题 2.2 幸运儿

算法与数据结构实验题 2.2 幸运儿 ★实验任务 泡泡最近下了个饱了吗 app,这个 app 推出了个坑蒙拐骗的红包系统,只要花一块钱买张一元抵用券,就有参与 20 元红包的抽奖机会,抽奖界面会实...
  • qq_40632377
  • qq_40632377
  • 2017年10月28日 10:23
  • 49

数据结构上机实验-二叉排序树的创建

二叉排序树 二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree),亦称二叉搜索树。 二叉排序树或者是一棵空树,或者是具有下列性质的二叉...
  • qq_29600137
  • qq_29600137
  • 2015年12月06日 19:12
  • 516

链表相关的算法题大汇总 — 数据结构之链表奇思妙想

声明:转自http://hi.baidu.com/lanxuezaipiao/item/afc616caf8393a155050585b 基本函数 1,构造节点:  //定义节点类型 struct...
  • lanxuezaipiao
  • lanxuezaipiao
  • 2014年03月25日 21:18
  • 2785

数据结构和算法经典100题-第1题

说在开头的话:如果拿金庸武侠做个比喻,数据结构和算法的学习就好比是程序员内功。内功的修炼往往不能一蹴而就,需要水滴石川。在博客中的这个分类中,专门记录我在数据结构和算法中的修炼。希望数据结构和算法的武...
  • bobkentblog
  • bobkentblog
  • 2015年03月26日 17:48
  • 1157

微软等数据结构+算法面试100题全部答案集锦

1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ ...
  • lipengshiwo
  • lipengshiwo
  • 2016年11月26日 17:28
  • 3413

数据结构算法设计题汇总(1)

为了更好地学习数据结构,方便自己复习反思,特建立此分类进行课后习题的总结,通过总结来督促自己学习与反思,提升水平,一步步找出更好的算法。1.将一元素插入一个有序的顺序表中,使其仍然有序,写出能够实现此...
  • kelvinmao
  • kelvinmao
  • 2016年03月30日 23:08
  • 1509

数据结构实验之查找七:线性之哈希表

数据结构实验之查找五:平方之哈希表 Time Limit: 400MS Memory limit: 65536K 题目描述 给定的一组无重复数据的正整数,根据给定的哈希函数建立其对应...
  • flying_star521
  • flying_star521
  • 2016年08月25日 09:52
  • 1016

数据结构实验十 排序算法

头文件 #include #include #include using namespace std; #define MAX 500000 /*从文件中读入数据存入数组a*/ int readD...
  • Summer__show_
  • Summer__show_
  • 2016年12月10日 15:09
  • 369

微软等数据结构+算法面试100题全部答案集锦

微软等数据结构+算法面试100题全部答案集锦 作者:July、阿财。 时间:二零一一年十月十三日。 引言      无私分享造就开源的辉煌。      今是二零一一年十月十三...
  • GarfieldEr007
  • GarfieldEr007
  • 2015年10月06日 14:04
  • 5677
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构与算法实验题 7.1 M 商人的求救
举报原因:
原因补充:

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