九度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 ...
随机推荐
- http系列--HTTP2.0新特性:二进制传输,多路复用,Haeder压缩,服务端push,QUIC协议
一.前言 HTTP 2.0 相比于 HTTP 1.X,可以说是大幅度提高了 web 的性能. 在 HTTP 1.X 中,为了性能考虑,我们会引入雪碧图.将小图内联.使用多个域名等等的方式.这一切都是因 ...
- workflow engine Ruote初体验之二(通用属性)
罗列一下表达式所支持的属性: :timeout :if/ unless :forget :lose :flank :on_error :on_cancel :on_timeout :tag :filt ...
- mariadb设置utf8mb4
1 . mysql真正的utf8是utf8mb4才是有效的utf8 a). mariaDB的设置方法 #vim /etc/my.conf [mysqld] character_set_server=u ...
- Storyboards Tutorial 01
Storyboarding 是在ios 5时候引进入的一个非常出色的特性.节省了为app创建user interfaces的时间.
- 键盘弹出后上提view隐藏后下拉view还原并修改scroll过程中旋转屏幕到竖屏view显示错误
1,注册键盘相应事件 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillSho ...
- angular使用canvas操作时报错
最近,用 angular 前端框架为应用登录新增图形验证码认证,由于没有现成的插件,于是便使用canvas+js操作,也是可以正常使用,但是在编译阶段却有个报错: ERROR in src/app/l ...
- java.io.IOException: Cannot run program "java" (in directory "/data01/var/lib/jenkins/workspace/2540cb62a866eda983ab8cba34fcd4f9"): error=2, No such file or directory
通过下图所示方式,可以在同一台机器上启动多个jenkins slave 执行项目的时候报错: 解决办法:首先排查,目标文件或者目录是否存在,如果存在,则在目录机器添加/usr/bin/java的软链接 ...
- Android - EditText 注意(缺少字符)
EditText 注意(缺少字符) 本文地址:http://blog.csdn.net/caroline_wendy EditText使用监听(Listener)addTextChangedListe ...
- 转: IO设计模式:Reactor和Proactor对比
转: https://segmentfault.com/a/1190000002715832 平时接触的开源产品如Redis.ACE,事件模型都使用的Reactor模式:而同样做事件处理的Proact ...
- java怎样将一个List传入Oracle存储过程
java怎样将一个List传入Oracle存储过程.样例例如以下: 数据库端建一个PL/SQL的数组. CREATE OR REPLACE TYPE tables_array AS VARRAY(10 ...