没地方存代码系列————一堆最短路
http://59.77.139.92/Problem.jsp?pid=1499
FJUTOJ 1499 直接建图求s到T的最短路就可以了。
Floyd
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 const int maxn = 205; 5 6 int n,m,mp[maxn][maxn]; 7 /** 8 9 dp[k][i][j] 1~k i->j的最短路 10 dp[k][i][j]=min(dp[k-1][i][j],dp[k-1][i][k]+dp[k-1][k][j]) 11 12 i->k->j 13 i->j 与 i->k,k->j 的最短路 14 只与k,k-1省略一维度空间后 15 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]); 16 */ 17 int main() 18 { 19 while(~scanf("%d%d",&n,&m)) 20 { 21 for(int i=0; i<n; i++) 22 for(int j=0; j<n; j++) 23 if(i==j)mp[i][j]=0; 24 else mp[i][j]=1e9; 25 for(int i=0; i<m; i++) 26 { 27 int x,y,z; 28 scanf("%d%d%d",&x,&y,&z); 29 mp[x][y]=min(z,mp[x][y]); 30 mp[y][x]=min(z,mp[y][x]); 31 } 32 int s,t; 33 scanf("%d%d",&s,&t); 34 for(int k=0; k<n; k++) 35 for(int i=0; i<n; i++) 36 for(int j=0; j<n; j++) 37 mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]); 38 39 if(mp[s][t]==1e9)puts("-1"); 40 else printf("%d\n",mp[s][t]); 41 42 } 43 return 0; 44 }
SPFA+邻接表
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 const int maxn = 205; 5 vector<pair<int,int> >E[maxn]; 6 7 int n,m; 8 int d[maxn],inq[maxn]; 9 void init() 10 { 11 for(int i=0; i<maxn; i++)E[i].clear(); 12 for(int i=0; i<maxn; i++)inq[i]=0; 13 for(int i=0; i<maxn; i++)d[i]=1e9; 14 } 15 16 int main() 17 { 18 while(cin>>n>>m) 19 { 20 init(); 21 for(int i=0; i<m; i++) 22 { 23 int x,y,z; 24 scanf("%d%d%d",&x,&y,&z); 25 E[x].push_back(make_pair(y,z));///x->y 距离z 26 E[y].push_back(make_pair(x,z)); 27 } 28 int s,t; 29 scanf("%d%d",&s,&t);//从s->t 30 31 queue<int>Q; 32 Q.push(s),d[s]=0,inq[s]=1; 33 while(!Q.empty()) 34 { 35 int now=Q.front(); 36 Q.pop(); 37 inq[now]=0; 38 for(int i=0; i<E[now].size(); i++) 39 { 40 int v=E[now][i].first; 41 if(d[v]>d[now]+E[now][i].second) 42 { 43 d[v]=d[now]+E[now][i].second;//松弛操作 44 if(inq[v]==1)continue; 45 inq[v]=1; 46 Q.push(v); 47 } 48 } 49 } 50 if(d[t]==1e9)printf("-1\n"); 51 else printf("%d\n",d[t]); 52 } 53 return 0; 54 }
SPFA+链式前向星,忘记初始化了,改半天,醉了╮(╯▽╰)╭
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 7 #define INF 1<<29 8 9 using namespace std; 10 const int maxn = 10010; 11 12 int n,m; 13 struct edge 14 { 15 int to,w,next; 16 }edge[maxn*2]; 17 int first[maxn],sign; 18 19 void init() 20 { 21 memset(first,0,sizeof(first)); 22 sign=1; 23 } 24 25 void add_edge(int u,int v,int w) 26 { 27 edge[sign].to=v; 28 edge[sign].w=w; 29 edge[sign].next=first[u]; 30 first[u]=sign++; 31 } 32 33 void spfa(int s,int t) 34 { 35 queue<int>q; 36 int inq[maxn]={0},dis[maxn],now; 37 for(int i=1;i<=n;i++) 38 { 39 dis[i]=INF; 40 } 41 q.push(s); 42 inq[s]=1,dis[s]=0; 43 while(!q.empty()) 44 { 45 now=q.front(); 46 q.pop(); 47 inq[now]=0; 48 for(int i=first[now];i;i=edge[i].next) 49 { 50 int to=edge[i].to; 51 if(dis[to]>dis[now]+edge[i].w) 52 { 53 dis[to]=dis[now]+edge[i].w; 54 if(!inq[to]) 55 { 56 inq[to]=1; 57 q.push(to); 58 } 59 } 60 } 61 } 62 63 if(dis[t]==INF)puts("-1"); 64 else printf("%d\n",dis[t]); 65 } 66 67 int main() 68 { 69 int x,y,z,s,t; 70 while(~scanf("%d%d",&n,&m)) 71 { 72 init(); 73 for(int i=0;i<m;i++) 74 { 75 scanf("%d%d%d",&x,&y,&z); 76 add_edge(x,y,z); 77 add_edge(y,x,z); 78 } 79 scanf("%d%d",&s,&t); 80 spfa(s,t); 81 } 82 return 0; 83 }
FJUTOJ 1501 http://59.77.139.92/Problem.jsp?pid=1501
SPFA+邻接矩阵
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstring> 5 #include <queue> 6 #define INF 1<<29 7 #define MAXN 1005 8 9 using namespace std; 10 int n,m,s,mp[MAXN][MAXN]; 11 12 int spfa(int s,int t) 13 { 14 int dis[MAXN],inq[MAXN]; 15 for(int i=0;i<=n;i++) 16 { 17 dis[i]=INF,inq[i]=0; 18 } 19 queue<int>q; 20 q.push(0); 21 dis[0]=0,inq[0]=1; 22 while(!q.empty()) 23 { 24 int now=q.front(); 25 q.pop(); 26 inq[now]=0; 27 for(int i=0;i<=n;i++) 28 { 29 if(dis[i]>dis[now]+mp[now][i]) 30 { 31 dis[i]=dis[now]+mp[now][i]; 32 if(!inq[i]) 33 { 34 inq[i]=1; 35 q.push(i); 36 } 37 } 38 } 39 } 40 if(dis[t]==INF) return -1; 41 return dis[t]; 42 } 43 44 int main() 45 { 46 int u,v,w,num,tmp; 47 while(~scanf("%d%d%d",&n,&m,&s)) 48 { 49 for(int i=0;i<=n;i++) 50 { 51 for(int j=0;j<=n;j++) 52 { 53 if(i==j)mp[i][j]=0; 54 else mp[i][j]=INF; 55 } 56 } 57 for(int i=0;i<m;i++) 58 { 59 scanf("%d%d%d",&u,&v,&w); 60 mp[u][v]=min(mp[u][v],w); 61 } 62 scanf("%d",&num); 63 while(num--) 64 { 65 scanf("%d",&tmp); 66 mp[0][tmp]=0; 67 } 68 printf("%d\n",spfa(0,s)); 69 } 70 return 0; 71 }
FJUT OJ 1443 http://59.77.139.92/Problem.jsp?pid=1443
直接建图,求1-n的最短路,dijkstra一堆for的版本
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstring> 5 #define INF 1<<29 6 7 using namespace std; 8 int mp[1005][1005],i,j,t,n,a,b,c; 9 10 void dijkstra() 11 { 12 int minn,v,dis[1005],vis[1005]={0}; 13 for(i=1;i<=n;i++) 14 dis[i]=mp[1][i]; 15 16 for(i=1;i<=n;i++) 17 { 18 minn=INF; 19 for(j=1;j<=n;j++) 20 { 21 if(!vis[j]&&dis[j]<minn) 22 { 23 v=j; 24 minn=dis[j]; 25 } 26 } 27 vis[v]=1; 28 29 for(j=1;j<=n;j++) 30 { 31 if(!vis[j]&&dis[j]>mp[v][j]+dis[v]) 32 { 33 dis[j]=mp[v][j]+dis[v]; 34 } 35 } 36 } 37 printf("%d\n",dis[n]); 38 } 39 40 int main() 41 { 42 while(~scanf("%d%d",&t,&n)) 43 { 44 for(i=1;i<=n;i++) 45 { 46 for(j=1;j<=n;j++) 47 { 48 if(i==j) 49 { 50 mp[i][j]=0; 51 } 52 else 53 { 54 mp[i][j]=mp[j][i]=INF; 55 } 56 } 57 } 58 for(i=0;i<t;i++) 59 { 60 scanf("%d%d%d",&a,&b,&c); 61 if(mp[a][b]>c)mp[a][b]=mp[b][a]=c; 62 } 63 dijkstra(); 64 } 65 66 return 0; 67 }
FJUTOJ 1456 http://59.77.139.92/Problem.jsp?pid=1456
转向次数可以看作路径长度,建图求最短路,这里用的是链式前向星+dijkstra
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstring> 5 #define INF 0x3fffffff 6 7 using namespace std; 8 const int maxn =10010; 9 10 int first[maxn],sign; 11 12 struct node 13 { 14 int to,w,next; 15 }edge[maxn*2]; 16 17 void creat() 18 { 19 for(int i=0;i<maxn;i++) 20 first[i]=0; 21 sign=1; 22 } 23 24 void add_edge(int u,int v,int w)///u->v cost w 25 { 26 edge[sign].w=w; 27 edge[sign].to=v; 28 edge[sign].next=first[u]; 29 first[u]=sign++; 30 } 31 32 int dij(int n,int a,int b) 33 { 34 int dis[n+5],vis[n+5]; 35 int nn=n-1; 36 for(int i=0;i<=n;i++) 37 { 38 dis[i]=INF,vis[i]=0; 39 } 40 dis[a]=0; 41 int p=a; 42 while(nn--) 43 { 44 vis[p]=1; 45 for(int k=first[p];k;k=edge[k].next) 46 { 47 int to=edge[k].to; 48 if(!vis[to]&&dis[to]>dis[p]+edge[k].w) 49 { 50 dis[to]=dis[p]+edge[k].w; 51 } 52 } 53 int mincost=INF; 54 for(int i=1;i<=n;i++) 55 { 56 if(!vis[i]&&dis[i]<mincost) 57 { 58 mincost=dis[i]; 59 p=i; 60 } 61 } 62 if(mincost==INF)return -1; 63 } 64 return dis[b]; 65 } 66 67 int main() 68 { 69 int n,a,b,num,tmp; 70 while(~scanf("%d%d%d",&n,&a,&b)) 71 { 72 creat(); 73 for(int i=1;i<=n;i++) 74 { 75 scanf("%d%d",&num,&tmp); 76 add_edge(i,tmp,0); 77 for(int j=1;j<num;j++) 78 { 79 scanf("%d",&tmp); 80 add_edge(i,tmp,1); 81 } 82 } 83 int ans=dij(n,a,b); 84 printf("%d\n",ans); 85 } 86 return 0; 87 }