数据结构与算法实验题 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;
}


相关文章推荐

数据结构实验7.1 7.2 二叉树

  • 2013年05月20日 17:25
  • 6KB
  • 下载

MIT:算法导论——7.1.基本数据结构_栈、队列、链表、有根树

【教材:第10章 基本数据结构】 (1)栈——后进先出 说明:采用一个数组S[1...n]来实现一个最多容纳n个元素的栈。  S.top=0时,栈不包含任何元素,栈空。下溢,上溢:S.top超过...

【数据结构】算法7.1-7.2 图的存储结构-数组表示法

#include #include #include#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEAS...

数据结构与算法实验题-战争来了

★实验任务 兽族和不死又要开战了。但是兽族的军队都是分部落管理的,为此,兽王 ——先知萨尔,要先知道自己能调度多少军队,才能在跟不死族开战的时候做好部署。已知现在兽族有 N 个兽人,编号从 1 到 N...

福大数据结构与算法实验题 Who is behind(双端队列)

★实验任务 开学了,有 N 个新生需要排成一列。这 N 个新生编号从 1 到 N,为了排队方便,按编号 从 1 到 N 顺序入队伍,起始队伍为空,每个人进队伍的选择有两种,一种是直接排在当前队 ...

数据结构与算法实验题 9.1 K 歌 DFS+剪枝

数据结构与算法实验题 K 歌 ★实验任务 3* n 个人(标号1 3 n )分成 n 组 K 歌。有 m 个 3 人组合,每个组合都对应一个分数,你能算出最大能够得到的总分数么? ★数据输入 输入的第...

数据结构与算法实验题 11.3 最小权语言问题

★问题描述:  字母表 A 由 m 个英文字母组成。字母表中的每个英文字母都有一个权。一个单词的权是单词中每个字母的权之和。定义在字母表上的语言是由字母表中字母组成的不同单词的集  合。一个语言的权是...

数据结构与算法实验题 5.2 排序

数据结构与算法实验题 5.2 排序 ★实验任务 通过交换元素位置实现排序的算法通常称为交换排序算法。如果只允许交换相邻元素的 位置,则称为相邻交换排序算法,如冒泡排序算法。 给定 n 个待排成...

算法和数据结构面试题(24)-几个数的和等于m

题目 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来. 解题思路 有没有和之前做过的一题有点类似。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构与算法实验题 7.1 M 商人的求救
举报原因:
原因补充:

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