九度OJ 1162:I Wanna Go Home(我想回家) (最短路径)
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:870
解决:415
- 题目描述:
-
The country is facing a terrible civil war----cities in the country are divided into two parts supporting different leaders. As a merchant, Mr. M does not pay attention to politics but he actually knows the severe situation, and your task is to help him
reach home as soon as possible.
"For the sake of safety,", said Mr.M, "your route should contain at most 1 road which connects two cities of different camp."
Would you please tell Mr. M at least how long will it take to reach his sweet home?
- 输入:
-
The input contains multiple test cases.
The first line of each case is an integer N (2<=N<=600), representing the number of cities in the country.
The second line contains one integer M (0<=M<=10000), which is the number of roads.
The following M lines are the information of the roads. Each line contains three integers A, B and T, which means the road between city A and city B will cost time T. T is in the range of [1,500].
Next part contains N integers, which are either 1 or 2. The i-th integer shows the supporting leader of city i.
To simplify the problem, we assume that Mr. M starts from city 1 and his target is city 2. City 1 always supports leader 1 while city 2 is at the same side of leader 2.
Note that all roads are bidirectional and there is at most 1 road between two cities.
Input is ended with a case of N=0.
- 输出:
-
For each test case, output one integer representing the minimum time to reach home.
If it is impossible to reach home according to Mr. M's demands, output -1 instead.
- 样例输入:
-
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
0
- 样例输出:
-
100
90
540
思路:
题目大意是N个城市分属于两个敌对集团,要从城市1到城市2(分别属于两个集团),只能有一条路跨集团,求最短路径。
我的思路是,求城市1到其集团中其它城市的最短路径,城市2也同样,然后对集团间存在的路径i到j,求d(1,i)+d(i,j)+d(j,2)的最小值。
代码:
#include <stdio.h> #define N 600
#define M 10000
#define INF 1e8 int n;
int D[N][N];
int support[N], visit[2][N], dis[2][N]; void init()
{
for (int i=0; i<n; i++)
{
support[i] = 0;
visit[0][i] = visit[1][i] = 0;
dis[0][i] = dis[1][i] = INF;
for (int j=0; j<n; j++)
{
D[i][j] = INF;
}
}
} void printdis(int s)
{
int i;
for (i=0; i<n; i++)
{
if (support[i] == s)
printf("%d\n", dis[s][i]);
}
printf("\n");
} void dijkstra(int s)
{
int i, j;
for (i=0; i<n; i++)
{
if (support[i] == s)
dis[s][i] = D[s][i];
}
dis[s][s] = 0;
visit[s][s] = 1;
//printdis(s); int mind;
int k;
for (i=0; i<n; i++)
{
mind = INF;
for (j=0; j<n; j++)
{
if ( support[j] == s && !visit[s][j] && (dis[s][j]<mind) )
{
mind = dis[s][j];
k = j;
}
}
if (mind == INF)
break;
visit[s][k] = 1;
for (j=0; j<n; j++)
{
if ( support[j] == s && !visit[s][j] && (dis[s][k]+D[k][j] < dis[s][j]) )
{
dis[s][j] = dis[s][k]+D[k][j];
}
}
}
//printdis(s);
} int Min(int a, int b)
{
return (a<b) ? a : b;
} int main(void)
{
int m, i, j;
int a, b, d;
int min; while (scanf("%d", &n) != EOF && n)
{
init();
scanf("%d", &m);
for(i=0; i<m; i++)
{
scanf("%d%d%d", &a, &b, &d);
D[a-1][b-1] = D[b-1][a-1] = d;
}
for(i=0; i<n; i++)
{
scanf("%d", &a);
support[i] = a-1;
} dijkstra(0);
dijkstra(1); min = INF;
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
if (support[i] == 0 && support[j] == 1)
{
min = Min(dis[0][i] + D[i][j] + dis[1][j], min);
}
}
}
if (min == INF)
printf("-1\n");
else
printf("%d\n", min);
} return 0;
}
/**************************************************************
Problem: 1162
User: liangrx06
Language: C
Result: Accepted
Time:20 ms
Memory:2336 kb
****************************************************************/
九度OJ 1162:I Wanna Go Home(我想回家) (最短路径)的更多相关文章
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ 1502 最大值最小化(JAVA)
题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...
- 九度OJ,题目1089:数字反转
题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个数反转的和是否等于两个数的和的反转. 输入: 第一行一个正整数表示测试数据的个数n. ...
- 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)
题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...
- 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...
- 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)
题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述: 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但 ...
- 九度OJ 1371 最小的K个数 -- 堆排序
题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
随机推荐
- (6)centos安装和解压
一.rpm包安装方式步骤:1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录:2.打开一个终端,su -成root用户:3.cd soft.version.rpm所在的目录 ...
- python第三方库离线安装-使用pip
参考:http://www.cnblogs.com/michael-xiang/p/5690746.html 操作系统:CentOS 6.9 python:2.7.14 (默认的2.6.6需要升级到2 ...
- Python环境安装与配置
1.官网下载:https://www.python.org/选择不同的版本 2.进入运行:使用pip安装selenium 3.设置pip的环境变量 4.安装后使用pip(一个Python包管理工具)安 ...
- SQL Server Debugging with WinDbg – an Introduction
Klaus Aschenbrenner Klaus Aschenbrenner provides independent SQL Server Consulting Services across E ...
- su su- sudo
su的作用是变更为其它使用者的身份,超级用户除外,需要键入该使用者的密码. linux su 命令 建议大家切换用户的时候 使用 su - root 这样,否则可能发现某些命令执行不了 关于su .s ...
- 鸟哥的linux私房菜服务器架设篇之准备工作和网络基础
架设服务器的基本功课 1基础网络的基本概念,以方便进行联网和设定及除错 2熟悉操作系统的简易操作:包括登录分析,账号管理,文本编辑器的使用等等的技巧 3信息安全方面:包括防火墙与软件更新方面的相关知识 ...
- ES6 rest与扩展运算符
1.rest 变量将多余的参数放入数组中. function add(...values) { let sum = 0; for (var val of values) { sum += val; } ...
- Java Swing界面编程(25)---事件处理:鼠标事件及监听处理
假设想对一个鼠标的操作进行监听,假设鼠标按下.松开等.则能够使用MouseListener接口. package com.beyole.util; import java.awt.event.Mous ...
- oracle 客户端连接
客户端安装时选择管理员模式安装. 连接配置: 首先找到:\app\Administrator\product\11.2.0\client_1\network\admin 文件夹下 tnsnames. ...
- Vue.js 很好,但会比 Angular 或 React 更好吗?
文章转自:http://www.oschina.net/translate/vuejs-is-good-but-is-it-better-than-angular-or-rea Vue.js 是一个用 ...