大一集训 最短路 spfa,floyd,Dijkstra

A - 畅通工程续 HDU - 1874

spfa

 1 #include <iostream>
 2 #include <map>
 3 #include <string>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<cmath>
 7 #include<queue>
 8 #define maxn 205
 9 #define INF 0x3f3f3f3f
10 using namespace std;
11 int d[maxn], vis[maxn];
12 int n, m;
13 
14 struct lu {
15     int to;
16     int cos;
17 }ok;
18 vector<lu>g[maxn];
19 int spfa(int s, int t) {
20     queue<int>q;
21     q.push(s), d[s] = 0, vis[s] = 1;
22     while (!q.empty()) {
23         int temp = q.front();
24         q.pop();
25         vis[temp] = 0;
26         for (int i = 0;i < g[temp].size();i++) {
27             int next = g[temp][i].to;
28             if (d[next] > d[temp] + g[temp][i].cos) {
29                 d[next] = d[temp] + g[temp][i].cos;
30                 if (vis[next] == 1)continue;
31                 vis[next] == 1;
32                 q.push(next);
33             }
34         }
35     }
36     if (d[t] == INF)return -1;
37     return d[t];
38 }
39 void init() {
40 for (int i = 0;i < maxn;i++) {
41         g[i].clear();
42         vis[i] = 0;
43         d[i] = INF;
44     }
45 }
46 int main() {
47     while (scanf("%d %d", &n, &m)!=EOF) {
48         init();
49         for (int i = 0;i < m;i++) {
50             int x, y, z;
51             scanf("%d %d %d", &x, &y, &z);
52             ok.to = y;
53             ok.cos = z;
54             g[x].push_back(ok);
55             ok.to = x;
56             ok.cos = z;
57             g[y].push_back(ok);
58         }
59         int s, t;
60         scanf("%d %d", &s, &t);
61         printf("%d\n", spfa(s, t));
62     }
63     return 0;
64 }
View Code

Dijkstra

 1 #include <iostream>
 2 #include <map>
 3 #include <string>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<cmath>
 7 #include<queue>
 8 #define inf 0x3f3f3f3f
 9 #define maxn 1010
10 using namespace std;
11 int n, m, s, t, vis[maxn], dis[maxn], way[maxn][maxn];
12 void dijkstra() {
13     memset(vis, 0, sizeof vis);
14     for (int i = 0;i < n;i++) dis[i] = way[s][i];
15     dis[s] = 0;
16     vis[s] = 1;
17     for (int i = 1;i < n;i++) {
18         int x;
19         int m = inf;
20         for (int y = 0;y < n;y++) {//寻找为探寻且距离原点最小的点
21             if (vis[y] == 0 && dis[y] <= m) {
22                 m = dis[y];
23                 x = y;
24             }
25         }
26         vis[x] = 1;
27         for (int y = 0;y < n;y++) {//松弛
28             dis[y] = min(dis[y], dis[x] + way[x][y]);
29         }
30         
31     }
32 }
33 int main() {
34     while (scanf("%d %d", &n, &m) != EOF) {
35         memset(way, inf, sizeof way);
36         for (int i = 0;i < m;i++) {
37             int x, y, z;
38             scanf("%d %d %d", &x, &y, &z);
39             if (z < way[x][y])way[x][y] = way[y][x]=z;
40         }
41         scanf("%d %d", &s, &t);
42         dijkstra();
43         printf("%d\n", dis[t] == inf ? -1 : dis[t]);
44     }
45 }
View Code

B - 六度分离 HDU - 1869

 1 #include <iostream>
 2 #include <map>
 3 #include <string>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<cmath>
 7 #include<queue>
 8 #define maxn 500
 9 #define INF 0x3f3f3f3f
10 using namespace std;
11 int d[maxn], inq[maxn];
12 struct node {
13     int first;
14     int second;
15 }ok;
16 vector<node>g[maxn];
17 int spfa(int s, int t) {
18     for (int i = 0;i < maxn;i++) {
19         d[i] = INF;
20     }
21     queue<int>q;
22     q.push(s), d[s] = 0, inq[s] = 1;
23     while (!q.empty()) {
24         int temp = q.front();
25         q.pop();
26         inq[temp] = 0;
27         for (int i = 0;i < g[temp].size();i++) {
28             int next = g[temp][i].first;
29             if (d[next] > d[temp] + g[temp][i].second) {
30                 d[next] = d[temp] + g[temp][i].second;
31                 if (inq[next] == 1)continue;
32                 inq[next] = 1;
33                 q.push(next);
34             }
35         }
36     }
37     if (d[t]>7)return -1;
38     return d[t];
39 }
40 void init() {
41     for (int i = 0;i < maxn;i++) {
42         g[i].clear();
43         inq[i] = 0;
44         d[i] = INF;
45     }
46 }
47 int main() {
48     int n, m;
49     while (scanf("%d %d", &n, &m) != EOF) {
50         init();
51         for (int i = 0;i < m;i++) {
52             int x, y;
53             scanf("%d %d", &x, &y);
54             ok.first = y;
55             ok.second = 1;
56             g[x].push_back(ok);
57             ok.first = x;
58             ok.second = 1;
59             g[y].push_back(ok);
60         }
61         int res;
62         int flag = 1;
63         for (int i = 0;i < n;i++) {
64             for (int j = i+1;j < n;j++) {
65                 res = spfa(i, j);
66                 //printf("%d\n", res);
67                 if (res == -1)flag = 0;
68             }
69         }
70         if (flag == 1)printf("Yes\n");
71         else printf("No\n");
72     }
73 }
View Code

C - 一个人的旅行 HDU - 2066

 1 #include <iostream>
 2 #include <map>
 3 #include <string>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<cmath>
 7 #include<queue>
 8 #define maxn 2000
 9 #define INF 0x3f3f3f3f
10 using namespace std;
11 int d[maxn], inq[maxn];
12 struct node {
13     int first;
14     int second;
15 }ok;
16 vector<node>g[maxn];
17 int spfa(int s, int t) {
18     for (int i = 0;i < maxn;i++) {
19         d[i] = INF;
20     }
21     queue<int>q;
22     q.push(s), d[s] = 0, inq[s] = 1;
23     while (!q.empty()) {
24         int temp = q.front();
25         q.pop();
26         inq[temp] = 0;
27         for (int i = 0;i < g[temp].size();i++) {
28             int next = g[temp][i].first;
29             if (d[next] > d[temp] + g[temp][i].second) {
30                 d[next] = d[temp] + g[temp][i].second;
31                 if (inq[next] == 1)continue;
32                 inq[next] = 1;
33                 q.push(next);
34             }
35         }
36     }
37     return d[t];
38 }
39 void init() {
40     for (int i = 0;i < maxn;i++) {
41         g[i].clear();
42         inq[i] = 0;
43         d[i] = INF;
44     }
45 }
46 int main() {
47     int T, S,D;
48     while (scanf("%d %d %d", &T, &S,&D) != EOF) {
49         
50         init();
51         for (int i = 0;i < T;i++) {
52             int x, y,z;
53             scanf("%d %d %d", &x, &y,&z);
54             ok.first = y;
55             ok.second = z;
56             g[x].push_back(ok);
57             ok.first = x;
58             ok.second = z;
59             g[y].push_back(ok);
60         }
61         int arr[maxn],brr[maxn];
62         for (int i = 0;i < S;i++) {
63             scanf("%d", &arr[i]);
64         }
65         for (int i = 0;i < D;i++) {
66             scanf("%d",&brr[i]);
67         }
68         int cc = INF;
69         int res;
70         for (int i = 0;i < S;i++) {
71             for (int j = 0;j < D;j++) {
72                 res = spfa(arr[i], brr[j]);
73                 if (res < cc)cc = res;
74                 }
75             }
76         
77         printf("%d\n",cc);
78     }
79 }
View Code

 

D - Arbitrage HDU - 1217 

问你,加入你有一个货币b,然后呢经过一系列的买入卖出最后得到的b是否能增值。

floyd

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #define max(a,b)(a>b?a:b)
 5 #define N 50
 6 char str[N][N];//存储货币名称 
 7 double map[N][N];//存储汇率 
 8 int n,m;
 9 int count(char s[])//计算字符串编号 
10 {
11     int i;
12     for(i=0;i<n;i++)
13     {
14         if(strcmp(s,str[i])==0)//匹配到相符的字符串 
15             return i;
16     }
17     return -1;
18 }
19 int Floyd()
20 {
21     int i,j,k;
22     for(k=0;k<n;k++)
23     {
24         for(i=0;i<n;i++)
25         {
26             for(j=0;j<n;j++)
27             {
28                 map[i][j]=max(map[i][j],map[i][k]*map[k][j]);
29             }
30         }
31     }
32     for(i=0;i<n;i++)//判断是否存在套利 
33     {
34         if(map[i][i]>1)//货币转换成自身大于1则存在套利 
35             return 1;
36     }
37     return 0;
38 }
39 int main()
40 {
41     int i,ans=1;
42     char s1[N],s2[N];
43     double x;
44     while(~scanf("%d",&n))
45     {
46         if(n==0)
47             break;
48         memset(map,0,sizeof(map));
49         for(i=0;i<n;i++)
50             scanf("%s",str[i]);
51         scanf("%d",&m);
52         for(i=0;i<m;i++)
53         {
54             scanf("%s%lf%s",s1,&x,s2);
55             map[count(s1)][count(s2)]=x;
56         }
57         printf("Case %d: ",ans++);
58         if(Floyd()==1)
59             printf("Yes\n");
60         else
61             printf("No\n");
62     }
63     return 0;
64 }
View Code
  1 #include <iostream>
  2 #include <map>
  3 #include <string>
  4 #include<algorithm>
  5 #include<vector>
  6 #include<cmath>
  7 #include<queue>
  8 #define maxn 35
  9 #define INF 0x3f3f3f3f
 10 using namespace std;
 11 double dis[maxn];
 12 int inq[maxn];
 13 struct node {
 14     int first;
 15     double second;
 16 }ok;
 17 void inc() {
 18     for (int i = 0;i < maxn;i++) {
 19         dis[i] = 0;
 20         inq[i] = 0;
 21     }
 22 }
 23 vector<node>g[maxn];
 24 double spfa(int s, int t) {
 25     inc();
 26     queue<int>q;
 27     q.push(s), dis[s] = 1, inq[s] = 1;
 28     while (!q.empty()) {
 29         int temp = q.front();
 30         q.pop();
 31         inq[temp] = 0;
 32         for (int i = 0;i < g[temp].size();i++) {
 33             int next = g[temp][i].first;
 34             if (dis[next] < dis[temp] * g[temp][i].second) {
 35                 dis[next] = dis[temp] * g[temp][i].second;
 36                 if (next == 0)return dis[t];
 37                 if (inq[next] == 1)continue;
 38                 inq[next] = 1;
 39                 q.push(next);
 40             }
 41         }
 42     }
 43 
 44     //return dis[t];
 45 }
 46 void init() {
 47     for (int i = 0;i < maxn;i++) {
 48         g[i].clear();
 49         inq[i] = 0;
 50         dis[i] = 0;
 51     }
 52 }
 53 int main() {
 54     int m;
 55     int add = 1;
 56     while (scanf("%d", &m) ,m) {
 57         vector<string>v;
 58         string s;
 59         for (int i = 0;i < m;i++) {
 60             cin >> s;
 61             v.push_back(s);
 62         }
 63         init();
 64         int n;
 65         scanf("%d", &n);
 66         int number;
 67         for (int i = 0;i < n;i++) {
 68             string a;
 69             string b;
 70             double c;
 71             int aa;
 72             cin >> a;
 73             cin >> c;
 74             cin >> b;
 75             if (find(v.begin(), v.end(), a) == v.end())continue;
 76             if (find(v.begin(), v.end(), b) == v.end())continue;
 77             for (int j = 0;j < v.size();j++) {
 78                 if (v[j] == b) { ok.first = j; break; }
 79             }
 80             if (i == 0) {
 81                 for (int j = 0;j < v.size();j++) {
 82                     if (v[j] == a) { number = j;aa = j; break; }
 83                 }
 84             }
 85             else {
 86                 for (int j = 0;j < v.size();j++) {
 87                     if (v[j] == a) { aa = j; break; }
 88                 }
 89             }
 90             ok.second = c;
 91             g[aa].push_back(ok);
 92         }
 93         double res = spfa(number, number);
 94         printf("Case %d: ", add);
 95         if (res > 1.0)printf("Yes\n");
 96         else printf("No\n");
 97         getchar();
 98             add++;
 99     }
100 
101 }
View Code

 

posted @ 2020-02-19 16:34  programmer_w  阅读(1)  评论(0)    收藏  举报