单源最短路裸题

 #include<stdio.h>
#include<string.h>
#define min(a,b) (a)<(b)?a:b
#define INF 100001
int T,S,D,dist[],v[][],m,l[],r[]; void DIJKSTRA(int x){
int i,j,mi,minj;
bool visit[]={};
for(i=;i<=m;i++)dist[i]=v[x][i];
visit[x]=;
for(i=;i<m;i++){
mi=INF;
for(j=;j<=m;j++){
if(!visit[j]&&dist[j]<mi){
mi=dist[j];
minj=j;
}
}
if(mi==INF) return;
visit[minj]=;
for(j=;j<=m;j++){
if(!visit[j]&&dist[j]>dist[minj]+v[minj][j]){
dist[j]=dist[minj]+v[minj][j];
}
}
}
} int main(){
while(scanf("%d%d%d",&T,&S,&D)!=EOF){
int q,tm=0xFFFFFFF,i,j;
for(i=;i<;i++){
for(j=;j<;j++){
v[i][j]=INF;
}
}
m=-;
for(q=;q<=T;q++){
int a,b,va;
scanf("%d%d%d",&a,&b,&va);
v[a][b]=v[b][a]=min(va,v[a][b]);
if(a>m)m=a;
if(b>m)m=b;
}
for(q=;q<=S;q++)scanf("%d",&l[q]);
for(q=;q<=D;q++)scanf("%d",&r[q]);
for(i=;i<=S;i++){
DIJKSTRA(l[i]);
for(j=;j<=D;j++){
if(dist[r[j]]<tm)tm=dist[r[j]];
}
}
printf("%d\n",tm);
}
return ;
}

以前不太懂,头硬直接跑了s遍没有优化的dijkstra,每遍循环看下d个点取最优也能过,复杂度应该是O( s * (n^2) ),那么大概s不是很大,所以据说O(n^3)的floyd过不了(据说,我也不清楚),但是这样都能过。

不过现在重新看,这个题对于初学者来说应该还是很有亮点的。

它的s个起点、d个终点可以为其建立一个源点一个汇点,这样源点有条边到每个可行起点,而每个可行终点有条边到汇点,只需要从源点到汇点跑一次单源最短路,无需遍历终点直接输出汇点的dis就是答案了。

这种题当时要是没有水过去,而是被卡了找找网上的分析,应该很有帮助吧。

 #include<stdio.h>        //基本需要的头文件
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f; const int maxn=1e3+;
const int maxm=1e5+; struct pii{
int dis;
int s;
bool operator < (const pii x)const{
return dis > x.dis;
}
pii(int a,int b):dis(a),s(b){};
};
int head[maxn],nxt[maxm<<],val[maxm<<],point[maxm<<],size;
int dis[maxn]; void init(){
memset(head,-,sizeof(head));
size=;
} void add(int a,int b,int v){
point[size]=b;
val[size]=v;
nxt[size]=head[a];
head[a]=size++;
} void dij(int s,int t){ //传入出发点和到达点
int i;
priority_queue<pii>q;
q.push(pii(,s));
memset(dis,0x3f,sizeof(dis));
dis[s]=;
while(!q.empty()){
pii u=q.top();
q.pop();
if(u.dis>dis[u.s])continue;
for(i=head[u.s];~i;i=nxt[i]){
int j=point[i];
if(dis[j]>u.dis+val[i]){
dis[j]=u.dis+val[i];
q.push(pii(dis[j],j));
}
}
}
printf("%d\n",dis[t]); //或去掉在主函数中输出或操作
} int main(){
int t,s,d;
while(scanf("%d%d%d",&t,&s,&d)!=EOF){
init();
while(t--){
int a,b,v;
scanf("%d%d%d",&a,&b,&v);
add(a,b,v);
add(b,a,v);
}
for(int i = ; i <= s ; ++ i){
int a;
scanf("%d",&a);
add(,a,);
}
for(int i = ; i <= d ; ++ i){
int a;
scanf("%d",&a);
add(a,,);
}
dij(,);
}
return ;
}

hdu2066 一个人的旅行 最短路的更多相关文章

  1. HDU2066 一个人的旅行 最短路基础

    新手熟悉一下迪杰斯特拉... 一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  2. hdu-2066 一个人的旅行(最短路spfa)

    题目链接: 一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) Pr ...

  3. hdu2066一个人的旅行(dijkstra)

    Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰 ...

  4. HDU2066一个人的旅行/最短路问题

    一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  5. hdu2066一个人的旅行(floyd优化)

    一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  6. HDU2066一个人的旅行---(多起点多终点最短路径)

    http://acm.hdu.edu.cn/showproblem.php?pid=2066 一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memo ...

  7. hdu2066一个人的旅行(disjkstra)

    一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  8. hdu2066一个人的旅行(多源点多汇点的最短路径问题)

    /* 思路:多源点,多会点的最短路径! 将最小号-1的节点但最源点,将最大号+1的点当作汇点! 将问题转变成从一个源点到一个汇点的最短路径的问题! 开始忘记初始化vector了,哇了好多次....坑爹 ...

  9. HDU2066一个人的旅行(dijkstra)

    一开始拿到这个题感觉floyd可能会超,还是写了写,果然1WA+1TLE,之后觉得用dijkstra试试看看S和D会不会比较小,还是1WA+1TLE,最后还是借鉴了别人的做法. 把他的家作为起点,与他 ...

随机推荐

  1. export与export default exports与module.exports的用法

    转载:http://blog.csdn.net/zhou_xiao_cheng/article/details/52759632 本文原创地址链接:http://blog.csdn.net/zhou_ ...

  2. Unity游戏中关于伤害范围的计算

    1.纯数学计算 范围计算 + 方向计算: 先将不在伤害范围的敌人排除掉,再计算处于伤害范围并且角度正确的敌人. 以上的计算是以人物的中心来计算的, 所以这中方式就有些局限性了,比如:一个四足怪物,只有 ...

  3. js匿名函数和闭包总结

    js匿名函数和闭包总结 一.总结 一句话总结:匿名函数的最主要作用是创建闭包,闭包就是将函数内部和函数外部连接起来的一座桥梁.内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕.闭包可以用 ...

  4. Confluence 6 LDAP 服务器配置

    名字(Name) 输入一个有意义的 LDAP 服务器名字,会让你更好的识别你的目录服务器.例如: Example Company Staff Directory Example Company Cor ...

  5. Razor及HtmlHelper学习笔记

    Razor 不是编程语言.它是服务器端标记语言. 什么是Razor? Razor 是一种允许您向网页中嵌入基于服务器的代码(Visual Basic 和 C#)的标记语法. 当网页被写入浏览器时,基于 ...

  6. 学习总结(ASP.NET MVC 5)

    1. 无论什么时候,如果要写一个新的 MVC 的程序(网站),打开VS之后第一步永远都是“创建新的 ASP.NET MVC 项目” (“新建项目”—→“Web(Visual C#)”—→“ASP.NE ...

  7. Tomcat类加载器破坏双亲委派

    转载:https://blog.csdn.net/qq_38182963/article/details/78660779 http://www.cnblogs.com/aspirant/p/8991 ...

  8. java并发编程:线程安全管理类--原子操作类--AtomicLongArray

    1.类 AtomicLongArray public class AtomicLongArray extends Object implements Serializable 可以用原子方式更新其元素 ...

  9. Idea检入boss项目

    Idea检入boss项目  

  10. PHP打开空白的解决办法

    先打开错误提示,再查找原因 找到php.ini # 显示错误:On开启,Off关闭 display_errors = On 也可在php文件中加入以下任意一行代码 # 禁用错误报告 error_rep ...