最短路(挖坑)

先来十道最短路的基础题。

2544  最短路

裸的最短路,而且数据很小。可以把dijkstra,spfa,甚至floyd都写一遍。

dijkstra:

 1 //dijkstra
 2 #include <cstdio>
 3 #define min(x,y) (x<y)?x:y
 4 const int max_e=10005;
 5 const int max_v=105;
 6 const int INF=0x3f3f3f3f;
 7 int cost[max_v][max_v];
 8 bool vis[max_v];
 9 int d[max_v];
10 int V,E;
11 void dijkstra(int s)
12 {
13     for(int i=1;i<=V;i++)
14     {
15         d[i]=cost[s][i];
16         vis[i]=false;
17     }
18     d[s]=0;
19     while(true)
20     {
21         int v=-1;
22         for(int i=1;i<=V;i++)
23         {
24             if(!vis[i] && (v == -1 || d[i]<d[v]))
25                 v=i;
26         }
27         if(v==-1) break;
28         vis[v]=true;
29         for(int i=1;i<=V;i++)
30         {
31             d[i]=min(d[i], d[v]+cost[v][i]);
32
33         }
34     }
35 }
36 int main()
37 {
38     while(~scanf("%d%d",&V,&E))
39     {
40         if(!V && !E) break;
41         int from,to,co;
42         for(int i=1;i<=V;i++)
43         {
44             for(int j=1;j<=V;j++)
45             {
46                 if(i==j) cost[i][j]=0;
47                 cost[i][j]=INF;
48             }
49         }
50         for(int i=0;i<E;i++)
51         {
52             scanf("%d%d%d",&from,&to,&co);
53             cost[from][to]=cost[to][from]=co;
54         }
55         dijkstra(1);
56         printf("%d\n",d[V]);
57     }
58     return 0;
59 }

floyd:

 1 //floyd
 2 #include <cstdio>
 3 #define min(x,y) (x<y)?x:y
 4 const int max_e=10005;
 5 const int max_v=105;
 6 const int INF=0x3f3f3f3f;
 7
 8 int d[max_v][max_v];
 9 int V,E;
10
11 void Floyd()
12 {
13     for(int k=1;k<=V;k++)
14     {
15         for(int i=1;i<=V;i++)
16         {
17             for(int j=1;j<=V;j++)
18             {
19                 d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
20             }
21         }
22     }
23 }
24 int main()
25 {
26
27     while(~scanf("%d%d",&V,&E))
28     {
29         if(!V && !E) break;
30         int from,to,cost;
31         for(int i=1;i<=V;i++)
32         {
33             for(int j=1;j<=V;j++)
34             {
35                 if(i==j)
36                     d[i][j]=0;
37                 else
38                     d[i][j]=d[j][i]=INF;
39             }
40         }
41         for(int i=0;i<E;i++)
42         {
43             scanf("%d%d%d",&from,&to,&cost);
44             d[from][to]=d[to][from]=cost;
45         }
46         Floyd();
47         printf("%d\n",d[1][V]);
48     }
49     return 0;
50 }

2066  一个人的旅行

设一个虚拟结点0,就能用一次最短路就完成了。

 1 #include <cstdio>
 2 #define min(x,y) (x<y)?x:y
 3 #define max(x,y) (x>y)?x:y
 4 const int INF=0x3f3f3f3f;
 5 const int max_v=1005;
 6 int E,V,D,eend;
 7 int max_num;//剪枝
 8 int cost[max_v][max_v];
 9 bool vis[max_v];
10 int s[max_v],d[max_v];
11 void dijkstra(int s)
12 {
13     for(int i=0;i<=max_num;i++)
14     {
15         d[i]=cost[s][i];
16         vis[i]=false;
17     }
18     d[s]=0;
19     while(true)
20     {
21         int v=-1;
22         for(int i=0;i<=max_num;i++)
23         {
24             if(!vis[i] && (v==-1 || d[i]<d[v]))
25                 v=i;
26         }
27         if(v==-1) break;
28         vis[v]=true;
29         for(int i=0;i<=max_num;i++)
30         {
31             d[i]=min(d[i],d[v]+cost[v][i]);
32         }
33
34     }
35
36 }
37 int main()
38 {
39     while(~scanf("%d%d%d",&E,&V,&D))
40     {
41         //init
42         max_num=0;
43         for(int i=0;i<=max_v-5;i++)
44             for(int j=0;j<=max_v-5;j++)
45             {
46                 if(i==j) cost[i][j]=0;
47                 else cost[i][j]=INF;
48             }
49         int a,b,time;
50         for(int i=0;i<E;i++)
51         {
52             scanf("%d%d%d",&a,&b,&time);
53             max_num=max(max_num,a);
54             max_num=max(max_num,b);
55             if(cost[a][b]>time) cost[a][b]=cost[b][a]=time;
56         }
57
58         for(int i=0;i<V;i++)
59         {
60             scanf("%d",&s[i]);
61             cost[0][s[i]]=cost[s[i]][0]=0;
62         }
63
64         dijkstra(0);
65         int ans=INF;
66         for(int i=0;i<D;i++)
67         {
68             scanf("%d",&eend);
69             ans=min(ans,d[eend]);
70         }
71         printf("%d\n",ans);
72     }
73     return 0;
74 }

2112  HDU Today

用map<string, int>来搞。

 1 #include <cstdio>
 2 #include <map>
 3 #include <iostream>
 4 #include <cstring>
 5 #include <algorithm>
 6 using namespace std;
 7 const int ssize=34;
 8 int n,cnt;
 9 char start[ssize],over[ssize];
10 map<string,int>mmap;
11 const int maxn=155;
12 const int INF=0x3f3f3f3f;
13 int cost[maxn][maxn];
14 int d[maxn];
15 bool vis[maxn];
16 void init()
17 {
18     mmap.clear();//***
19     for(int i=1;i<=maxn-5;i++)
20     {
21         for(int j=1;j<=maxn-5;j++)
22         {
23             if(i==j) cost[i][j]=0;
24             else cost[i][j]=INF;
25         }
26     }
27 }
28 void dijkstra(int s)
29 {
30     for(int i=1;i<cnt;i++)
31     {
32         d[i]=cost[s][i];
33         vis[i]=false;
34     }
35     d[s]=0;
36     while(true)
37     {
38         int v=-1;
39         for(int i=1;i<cnt;i++)
40         {
41             if(!vis[i] && (v==-1 || d[i] < d[v]))
42                 v=i;
43         }
44         if(v==-1) break;
45         vis[v]=true;
46         for(int i=1;i<cnt;i++)
47         {
48             d[i]=min(d[i],d[v]+cost[v][i]);
49         }
50     }
51 }
52
53 int main()
54 {
55
56     while(~scanf("%d",&n))
57     {
58         if(n==-1) break;
59         init();
60         bool same=false;
61         scanf("%s%s",start,over);
62         if(!strcmp(start,over)) same=true;
63         mmap[start]=1;mmap[over]=2;
64
65         char s[ssize],o[ssize];
66         int dis;
67         cnt=3;
68         for(int i=0;i<n;i++)
69         {
70             scanf("%s%s%d",s,o,&dis);
71
72             if(!mmap[s]) mmap[s]=cnt++;
73             if(!mmap[o]) mmap[o]=cnt++;
74             cost[ mmap[s] ][ mmap[o] ]=cost[ mmap[o] ][ mmap[s] ]= min (cost[ mmap[s] ][ mmap[o] ] , dis);
75         }
76
77         if(same==true) {printf("0\n");continue;}
78         dijkstra(1);
79         if(d[2]!=INF)
80             printf("%d\n",d[2]);
81         else
82             printf("-1\n");
83     }
84     return 0;
85 }

时间: 2024-08-30 06:19:16

最短路(挖坑)的相关文章

【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. 在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论起了二叉搜索树.什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树.设key[p]表示结点p上的数值.对于其中的每个结点p,若其存在左孩子lch,则key

hdu3461Marriage Match IV 最短路+最大流

//给一个图.给定起点和终点,仅仅能走图上的最短路 //问最多有多少种走的方法.每条路仅仅能走一次 //仅仅要将在最短路上的全部边的权值改为1.求一个最大流即可 #include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<vector> using namespace std ; const int inf = 0x3f3f3f3f ; const

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<

ACM/ICPC 之 昂贵的聘礼-最短路解法(POJ1062)

//转移为最短路问题,枚举必经每一个不小于酋长等级的人的最短路 //Time:16Ms Memory:208K #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f #define MAX 105 int lim, n; int p[M

图论(A*算法,K短路) :POJ 2449 Remmarguts&#39; Date

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 25216   Accepted: 6882 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h

hdu4725 拆点+最短路

题意:有 n 个点,每个点有它所在的层数,最多有 n 层,相邻两层之间的点可以互相到达,消耗 c (但同一层并不能直接到达),然后还有一些额外的路径,可以在两点间互相到达,并且消耗一定费用.问 1 点到 n 点的最小花费 将每一层拆成两个点,分别为进入层和出发层,然后相邻层的出发层可以指向进入层,花费 c,每个点可以到达其出发层,而进入层可以到达该点,花费 0 ,最后建立其余双向边,最短路 1 #include<stdio.h> 2 #include<string.h> 3 #in

hdu3416 最短路+最大流

题意:有 n 点 m 边,有出发点 A 到达点 B ,只允许走原图中的最短路,但每条边只允许被走一次,问最多能找出多少条边不重复的最短路 一开始做到的时候瞎做了一发最短路,WA了之后也知道显然不对,就放着了,后来打了今年的多校,再做到的时候发现和多校第一场的1007一样的……最短路+网络流就行了,只不过第一次做这个的时候我还不知道网络流是啥,不会做也正常啦. 首先对于原图跑一遍最短路求出每个点距离 A 点的最短路,然后对于每一条边,如果它的权值等于它连接的两点的最短路的差值的时候,就说明这条路是

【啊哈!算法】算法7:Dijkstra最短路算法

上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图中的1号顶点到2.3.4.5.6号顶点的最短路径. <ignore_js_op> 与Floyd-Warshall算法一样这里仍然使用二维数组e来存储顶点之间边的关系,初始值如下. <ignore_js_op> 我们还需要用一个一维数组dis来存储1号顶点到其余各个顶点的初始路程,如下.