题意:

间谍在战争期间想要传递一份谍报回国,谍报可以在邮局之间传递,但这种传递是单向的,并且会少耗一些时间。但是如果两个邮局在同一个国家的话,那么谍报在这两个邮局之间传递是不消耗时间的。如果几个邮局发出的谍报可以通过一些路径相互到达,那么这些邮局就属于一个国家。那么问题来了:给出一个起点和终点,问最快什么时候能够将谍报传递到。

思路:

先Tarjan缩点,然后跑Dijkstra(Floyd可能会被卡,但是貌似有个哥们【现在应该叫前辈了】多交了几次,卡1000ms过了)(也可以记忆化搜索,spfa什么的 看个人喜好吧…)

原题请戳这里

  1. #include <stack>
  2. #include <vector>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <algorithm>
  6. using namespace std;
  7. int dfn[505],low[505],p[505],map[505][505],MAP[505][505],W[505],n,m,t,cnt;
  8. bool vis[505],VIS[505];
  9. vector<int>v[505];
  10. stack<int>stk;
  11. void tarjan(int x)
  12. {
  13. vis[x]=1;stk.push(x);low[x]=dfn[x]=++cnt;
  14. for(int i=0;i<v[x].size();i++)
  15. if(!dfn[v[x][i]])
  16. tarjan(v[x][i]),low[x]=min(low[x],low[v[x][i]]);
  17. else if(vis[v[x][i]])
  18. low[x]=min(low[x],dfn[v[x][i]]);
  19. if(low[x]==dfn[x]){
  20. t++;int jy;
  21. do jy=stk.top(),stk.pop(),p[jy]=t,vis[jy]=0;while(jy!=x);
  22. }
  23. }
  24. int dijkstra(int start,int end)
  25. {
  26. memset(VIS,0,sizeof(VIS));
  27. for(int i=1;i<=t;i++)
  28. W[i]=MAP[start][i];
  29. VIS[start]=1;
  30. for(int i=1;i<t;i++)
  31. {
  32. int minn=0x3fffffff,k=-1;
  33. for(int j=1;j<=t;j++)
  34. if(minn>W[j]&&!VIS[j])
  35. minn=W[j],k=j;
  36. VIS[k]=1;
  37. for(int j=1;j<=t;j++)
  38. if(!VIS[j]&&W[j]>W[k]+MAP[k][j])
  39. W[j]=W[k]+MAP[k][j];
  40. }
  41. return W[end]<0x3ffffff?W[end]:-1;
  42. }
  43. int main()
  44. {
  45. while(scanf("%d%d",&n,&m)&&n)
  46. {
  47. cnt=t=0;
  48. memset(map,0x3f,sizeof(map));
  49. memset(MAP,0x3f,sizeof(MAP));
  50. memset(dfn,0,sizeof(dfn));
  51. memset(vis,0,sizeof(vis));
  52. memset(p,0,sizeof(p));
  53. for(int i=1;i<=n;i++)v[i].clear();
  54. for(int i=1;i<=n;i++)map[i][i]=MAP[i][i]=0;
  55. for(int i=1;i<=m;i++)
  56. {
  57. register int xx,yy,weight;
  58. scanf("%d%d%d",&xx,&yy,&weight);
  59. v[xx].push_back(yy);
  60. if(weight<map[xx][yy])map[xx][yy]=weight;
  61. }
  62. for(int i=1;i<=n;i++)
  63. if(!dfn[i])tarjan(i);
  64. for(int i=1;i<=n;i++)
  65. for(int j=0;j<v[i].size();j++)
  66. if(p[i]!=p[v[i][j]])
  67. MAP[p[i]][p[v[i][j]]]=min(MAP[p[i]][p[v[i][j]]],map[i][v[i][j]]);
  68. scanf("%d",&m);
  69. for(int i=1;i<=m;i++)
  70. {
  71. register int xx,yy;
  72. scanf("%d%d",&xx,&yy);
  73. if(p[xx]==p[yy])printf("0\n");
  74. else
  75. {
  76. int jy=dijkstra(p[xx],p[yy]);
  77. if(jy==-1)printf("Nao e possivel entregar a carta\n");
  78. else printf("%d\n",jy);
  79. }
  80. }
  81. printf("\n");
  82. }
  83. }

就是这位前辈,卡1000ms过的。。



Dijkstra还是快点儿的。

POJ 3114 Tarjan+Dijkstra的更多相关文章

  1. Countries in War (POJ 3114) Tarjan缩点+最短路

    题目大意: 在一个有向图中,每两点间通信需要一定的时间,但同一个强连通分量里传递信息不用时间,给两点u,v求他们最小的通信时间.   解题过程: 1.首先把强连通分量缩点,然后遍历每一条边来更新两个强 ...

  2. POJ 3114 Countries in War(强连通+最短路)

    POJ 3114 Countries in War 题目链接 题意:给定一个有向图.强连通分支内传送不须要花费,其它有一定花费.每次询问两点的最小花费 思路:强连通缩点后求最短路就可以 代码: #in ...

  3. POJ 3114 Countries in War(强联通分量+Tarjan)

    题目链接 题意 : 给你两个城市让你求最短距离,如果两个城市位于同一强连通分量中那距离为0. 思路 :强连通分量缩点之后,求最短路.以前写过,总感觉记忆不深,这次自己敲完再写了一遍. #include ...

  4. poj 3114(强连通缩点+SPFA)

    题目链接:http://poj.org/problem?id=3114 思路:题目要求很简单,就是求两点之间的花费的最短时间,不过有一个要求:如果这两个city属于同一个国家,则花费时间为0.如何判断 ...

  5. poj 3114 Countries in War

    http://poj.org/problem?id=3114 #include <cstdio> #include <cstring> #include <queue&g ...

  6. POJ 2502 - Subway Dijkstra堆优化试水

    做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...

  7. poj 1556 (Dijkstra + Geometry 线段相交)

    链接:http://poj.org/problem?id=1556 The Doors Time Limit: 1000MS   Memory Limit: 10000K Total Submissi ...

  8. POJ 2762 tarjan缩点+并查集+度数

    Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15494 ...

  9. POJ 2502 Subway (Dijkstra 最短+建设规划)

    Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6689   Accepted: 2176 Descriptio ...

随机推荐

  1. vue中fetch请求

    1. 请求方式:get 请求参数:menuName 返回的结果:data created(){ this._initPageData() }, methods:{ _initPageData(){ f ...

  2. ES6学习历程(字符串的扩展)

    字符串的扩展 在看这一节的时候前半部分写的都是关于unicode的内容,我个人感觉这部分在实际的开发中用的很少,所以不打算在做记录,等届时用到再有针对性的看,所以就将在ES6里面关于字符串操作的一些新 ...

  3. PAT 1107 Social Clusters

    When register on a social network, you are always asked to specify your hobbies in order to find som ...

  4. 基于Python3.7和opencv的人脸识别(含数据收集,模型训练)

    前言 第一次写博客,有点紧张和兴奋.废话不多说,直接进入正题.如果你渴望使你的电脑能够进行人脸识别:如果你不想了解什么c++.底层算法:如果你也不想买什么树莓派,安装什么几个G的opencv:如果你和 ...

  5. [数据结构]C#顺序表的实现

    在数据结构的学习当中,想必C++可能是大家接触最多的入门语言了 但是C#的数据结构却很少看到,今天我写了一个C#顺序表的顺序存储结构 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是 ...

  6. zabbix 配置——bak

    1.host 配置 create host Parameter Description Host name 主机名,只允许数字,空格,句号,下划线,非主流符号它不支持.zabbix客户端配置文件中的h ...

  7. 【codeforces 768D】Jon and Orbs

    [题目链接]:http://codeforces.com/contest/768/problem/D [题意] 你有一个水晶; 它每天都会产生一个球??(球有k种) 然后每种球产生的可能性是相同的-& ...

  8. 移动端 javascript 计算html font-size

    直接上代码  (function(doc, win) {             var docEl = doc.documentElement,                 resizeEvt ...

  9. 怎样给你的Android 安装文件(APK)瘦身

    本文源地址:怎样给你的Android 安装文件(APK)瘦身 Android的apk文件越来越大了这已经是一个不争的事实. 在Android 还是最初版本号的时候,一个app的apk文件大小也还仅仅有 ...

  10. Oracle EBS 从Web界面进入责任时,提示不存在可用的有效责任

    Oracle EBS 从Web界面进入责任时,提示不存在可用的有效责任         每次在Web界面,点击某一责任的功能时,弹出Form.会提示错误:对不起,不存在可用的有效责任.         ...