借bzoj1624练了一下模板(虽然正解只是floyd)
spfa:
| 
         1
         
         2
         
         3
         
         4
         
         5
         
         6
         
         7
         
         8
         
         9
         
         10
         
         11
         
         12
         
         13
         
         14
         
         15
         
         16
         
         17
         
         18
         
         19
         
         20
         
         21
         
         22
         
         23
         
         24
         
         25
         
         26
         
         27
         
         28
         
         29
         
         30
         
         31
         
         32
         
         33
         
         34
         
         35
         
         36
         
         37
         
         38
         
         39
         
         40
         
         41
         
         42
         
         43
         
         44
         
         45
         
         46
         
         47
         
         48
         
         49
         
         50
         
         51
         
         52
         
         53
         
         54
         
         55
         
         56
         
         57
         
         58
         
         59
         
         60
         
         61
         
         62
         
         63
         
         64
         | #include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <vector>#include <queue>usingnamespacestd;constintINF=100001;constintmaxm=10001,maxn=101;intn,m,x,y,w;longlongans=0;inta[maxm];intdist[maxn];boolvis[maxn];structedge{
               intto,w;    edge(int_to,int_w){to=_to;w=_w;}};vector <edge> g[maxm];voidspfa(intx){
               queue<int> q;    memset(dist,63,sizeof(dist));    memset(vis,false,sizeof(vis));    dist[x]=0;    vis[x]=1;    q.push(x);        while(!q.empty()){
                   intu=q.front();        q.pop();        vis[u]=0;        intl=g[u].size();        for(inti=0;i<l;i++){
                       intv=g[u][i].to;            if(dist[v]>dist[u]+g[u][i].w){
                           dist[v]=dist[u]+g[u][i].w;                if(!vis[v]){
                               vis[v]=1;q.push(v);                }            }        }    }}intmain(){
               freopen("data.in","r",stdin);    freopen("text.out","w",stdout);    //freopen("data.txt","r",stdin);    scanf("%d%d",&n,&m);    for(inti=1;i<=m;i++) scanf("%d",&a[i]);    for(inti=1;i<=n;i++)        for(intj=1;j<=n;j++){
                       scanf("%d",&w);            if(i!=j) g[i].push_back(edge(j,w));        }    for(inti=1;i<m;i++){
                   spfa(a[i]);        ans+=dist[a[i+1]];    }    cout<<ans;    return0;} | 
dijkstra+priority_queue:
| 
         1
         
         2
         
         3
         
         4
         
         5
         
         6
         
         7
         
         8
         
         9
         
         10
         
         11
         
         12
         
         13
         
         14
         
         15
         
         16
         
         17
         
         18
         
         19
         
         20
         
         21
         
         22
         
         23
         
         24
         
         25
         
         26
         
         27
         
         28
         
         29
         
         30
         
         31
         
         32
         
         33
         
         34
         
         35
         
         36
         
         37
         
         38
         
         39
         
         40
         
         41
         
         42
         
         43
         
         44
         
         45
         
         46
         
         47
         
         48
         
         49
         
         50
         
         51
         
         52
         
         53
         
         54
         
         55
         
         56
         
         57
         
         58
         
         59
         
         60
         
         61
         | #include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <vector>#include <queue>usingnamespacestd;constintINF=100001;constintmaxm=10001,maxn=101;intn,m,x,y,w;longlongans=0;inta[maxm];intdist[maxn];structedge{
               intto,w;    edge(int_to,int_w){to=_to;w=_w;}};vector <edge> g[maxm];typedefpair<int,int> P;voiddijkstra(intx){
               priority_queue< P , vector <P> , greater<P> > q;    memset(dist,63,sizeof(dist));    dist[x]=0;    q.push(P(0,x));        while(!q.empty()){
                   P u=q.top();        intx=u.second;        q.pop();        if(dist[x]<u.first) continue;        intl=g[x].size();        for(inti=0;i<l;i++){
                       intv=g[x][i].to;            if(dist[v]>dist[x]+g[x][i].w){
                           dist[v]=dist[x]+g[x][i].w;                q.push(P(dist[v],v));            }        }    }}intmain(){
               freopen("danger.in","r",stdin);    freopen("danger.out","w",stdout);    //freopen("data.txt","r",stdin);    scanf("%d%d",&n,&m);    for(inti=1;i<=m;i++) scanf("%d",&a[i]);    for(inti=1;i<=n;i++)        for(intj=1;j<=n;j++){
                       scanf("%d",&w);            if(i!=j) g[i].push_back(edge(j,w));        }    for(inti=1;i<m;i++){
                   dijkstra(a[i]);        ans+=dist[a[i+1]];    }    cout<<ans;    return0;} | 
   
 floyd:
| 
         1
         
         2
         
         3
         
         4
         
         5
         
         6
         
         7
         
         8
         
         9
         
         10
         
         11
         
         12
         
         13
         
         14
         
         15
         
         16
         
         17
         
         18
         
         19
         
         20
         
         21
         
         22
         
         23
         
         24
         
         25
         | #include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<cstring>#include<string>#include<queue>#include<stack>#include<vector>usingnamespacestd;intn,m,i,j,k,ans,f[102][102],a[10002];intmain(){
             cin>>n>>m;  for(i=1;i<=m;i++)scanf("%d",&a[i]);  for(i=1;i<=n;i++)  for(j=1;j<=n;j++)    scanf("%d",&f[i][j]);  for(k=1;k<=n;k++)  for(i=1;i<=n;i++)  for(j=1;j<=n;j++)    f[i][j]=min(f[i][j],f[i][k]+f[k][j]);  for(i=2;i<=m;i++)ans+=f[a[i-1]][a[i]];  cout<<ans;  return0;} |