大一集训 最短路 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 }
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 }
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 }
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 }
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 }
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 }

浙公网安备 33010602011771号