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 }
View Code

 

 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 }
View Code

 

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 }
View Code

 

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 }
View Code

 

  

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 }
View Code

 

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 }
View Code