题目链接:http://acm.swust.edu.cn/problem/767/

Time limit(ms): 1000        Memory limit(kb): 65535
 
Description

在涪江河的两边共有n个城市,其中位于一边的城市属于1类城市,另外一边的属于2类城市,(特别的:城市1属于1类,城市2属于2类)。现在知道一些道路的情况,比如知道城市1到城市5之间有一条长度为100的路。将军要从城市1回到城市2的家,他就开始设计回家的线路。回家时由于驾照的关系,只能越过一次涪江河。现在问从城市1到城市2的最短距离,路是双向的。

 
Input

多组测试数据。

每组数据的第一行输入城市个数N(2<=N<=600),第二行输入城市之间的路的数目M((0<=M<=10000),

接下里M行,输入每条道路的信息,每行S,E,T都是整数,代表城市S和城市E之间有一条长度为T的路。

最后一行N个数只能是1或2代表第i个城市属于哪类。

为了简化题目,我们总认为城市1是属于1类,城市2属于2类 N = 0时表示结束

 

Output

输出城市1到城市2的最短路径,如果不存在则输出-1

 
Sample Input
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
Sample Output
100
90
540
 

讨论版面

解题思路:一个Dijkstra题,注意一类城市,二类城市分属河两岸,且将军只能过河一次优化路径是注意下就OK了

     !vis[j] && (v[sign] == 1 || (v[sign] == 2 && v[j] == 2)) && dis[j] > dis[sign] + mpt[sign][j]

     基于只能过河一次如果把一二类城市间连通状态改成单向应该也可以,到时有空去试一下Orz~~~

代码如下:

 #include <stdio.h>
#include <string.h>
#define inf 0x3f3f3f3f int m, n, mpt[][], v[], dis[], vis[];
void Dijkstra(){
int i, j, minn, sign;
for (i = ; i <= n; i++) dis[i] = mpt[][i];
vis[] = ;
dis[] = ;
for (i = ; i <= n; i++){
minn = inf;
for (j = ; j <= n; j++){
if (!vis[j] && minn > dis[j]){
minn = dis[j];
sign = j;
}
}
if (minn >= inf)break;
vis[sign] = ;
for (j = ; j <= n; j++){
if (!vis[j] && (v[sign] == || (v[sign] == && v[j] == )) && dis[j] > dis[sign] + mpt[sign][j])
dis[j] = dis[sign] + mpt[sign][j];
}
}
if (dis[] >= inf)
printf("-1\n");
else
printf("%d\n", dis[]);
} int main(){
int i, a, b, c;
while (~scanf("%d", &n) && n){
scanf("%d", &m);
memset(mpt, inf, sizeof(mpt));
memset(vis, , sizeof(vis));
for (i = ; i <= m; i++){
scanf("%d%d%d", &a, &b, &c);
if (c >= mpt[a][b])continue;
mpt[a][b] = c;
mpt[b][a] = c;
}
for (i = ; i <= n; i++) scanf("%d", &v[i]);
Dijkstra();
}
return ;
}

[Swust OJ 767]--将军回家(Dijkstra算法)的更多相关文章

  1. [Swust OJ 412]--医院设置(floyd算法)

    题目链接:http://acm.swust.edu.cn/problem/412/ Time limit(ms): 1000 Memory limit(kb): 65535   Description ...

  2. SWUST OJ 1075 求最小生成树(Prim算法)

    求最小生成树(Prim算法) 我对提示代码做了简要分析,提示代码大致写了以下几个内容 给了几个基础的工具,邻接表记录图的一个的结构体,记录Prim算法中最近的边的结构体,记录目标边的结构体(始末点,值 ...

  3. [Swust OJ 842]--实验室和食堂(最短路,Dijkstra算法)

    题目链接:http://acm.swust.edu.cn/problem/842/ Time limit(ms): 1000 Memory limit(kb): 10000   Description ...

  4. SDUT OJ 图结构练习——最短路径 ( Floyed 算法 AND Dijkstra算法)

    图结构练习——最短路径 Time Limit: 1000 ms            Memory Limit: 65536 KiB Submit Statistic Discuss Problem ...

  5. [Swust OJ 404]--最小代价树(动态规划)

    题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535   Des ...

  6. Cocos2d-x 地图步行实现1:图论Dijkstra算法

    下一节<Cocos2d-x 地图行走的实现2:SPFA算法>: http://blog.csdn.net/stevenkylelee/article/details/38440663 本文 ...

  7. 图的最短路径-----------Dijkstra算法详解(TjuOj2870_The Kth City)

    做OJ需要用到搜索最短路径的题,于是整理了一下关于图的搜索算法: 图的搜索大致有三种比较常用的算法: 迪杰斯特拉算法(Dijkstra算法) 弗洛伊德算法(Floyd算法) SPFA算法 Dijkst ...

  8. 图论——最短路径 Dijkstra算法、Floyd算法

    1.弗洛伊德算法(Floyd) 弗洛伊算法核心就是三重循环,M [ j ] [ k ] 表示从 j 到 k 的路径,而 i 表示当前 j 到 k 可以借助的点:红色部分表示,如果 j 到 i ,i 到 ...

  9. dijkstra算法的堆优化

    普通的dijkstra算法模板: //数据结构 int g[LEN][LEN]; //邻接矩阵 int vis[LEN]; //标记是否访问 int dist[LEN] //源点到各点的距离 fill ...

随机推荐

  1. QT 一些非常常用的操作

    一   如果在窗体关闭前自行判断是否可关闭二   如何用打开和保存文件对话框  三   如何使用警告.信息等对话框  四   在Windows下Qt里为什么没有终端输出五   想在源代码中直接使用中文 ...

  2. android -上传文件到服务器

    android上传文件到服务器       重点:最好是设置好content-type这些参数的配置!     package com.spring.sky.image.upload.network; ...

  3. 宣布发布全新的 Windows Azure 缓存预览版

    全新 Windows Azure 缓存的预览版现已发布.此托管服务可以提供闪电般的数据访问速度,以帮助您构建更具可伸缩性.响应更快的应用程序. 详情如下: ·    托管式缓存:这一全新的托管服务为需 ...

  4. 51nod 1244 莫比乌斯函数之和(杜教筛)

    [题目链接] http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 [题目大意] 计算莫比乌斯函数的区段和 [题解] 利 ...

  5. Kate Spade_百度百科

    Kate Spade_百度百科 Kate Spade

  6. 有道翻译API

    轻奢侈品_百度百科 轻奢侈品 有道翻译API 有道翻译API申请成功 API key:72763558 keyfrom:lexus-studio

  7. iOS 发布应用时屏蔽NSLog

    在开发过程中,经常需要使用NSLog来进行调试,但是NSLog是非常影响性能的,所以我们应该在发布应用时屏蔽掉NSLog,但是如果通过手工的去一行一行的改得话,未免太枯燥与费时了,庆幸的是,我们可以通 ...

  8. 最大流之sap算法

    若有向图G = (V , E)满足下列条件: 1.有且仅有一个顶点S,它的入度为 0 ,这个顶点称为源点. 2.有且仅有一个顶点T,它的出度为 0 ,这个顶点称为汇点. 3.每一条弧都有一个非负数,叫 ...

  9. python函数cmp()

    cmp(x, y) 中文说明:比较两个对象x和y,如果x < y ,返回负数:x == y, 返回0:x > y,返回正数. 版本:该函数只有在python2中可用,而且在python2所 ...

  10. Asp.net Role manager tutorial

    It is very useful in .net we can user framework provided role manager, and easily configure in Web.C ...