因为路是单向的,快递员从1到其他点,还要从其他点回来,是多源最短路径问题。可是floyd的O(n^3)只有40分。
回来的时候是其他点到1点,我们想如果是1到其他点就好了,我们把邻接矩阵倒过来
还有一个有重边,对floyd有影响
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
const int INF=0x3f3f3f3f;
int n,m,sum;
int dis[maxn],vis[maxn];
struct node{
int to,w;
}edge;
vector<node> e[maxn];
vector<node> e2[maxn];
void Dijkstra(){
memset(vis,0,sizeof(vis));
memset(dis,INF,sizeof(dis));
priority_queue<pair<int,int> >q;
q.push(make_pair(0,1));
dis[1]=0;
while(!q.empty()){
int now=q.top().second;
q.pop();
if(vis[now])continue;
vis[now]=1;
for(int i=0;i<e[now].size();i++){
int to=e[now][i].to;
if(dis[to]>dis[now]+e[now][i].w){
dis[to]=dis[now]+e[now][i].w;
q.push(make_pair(-dis[to],to));
}
}
}
}
void fDijkstra(){
memset(vis,0,sizeof(vis));
memset(dis,INF,sizeof(dis));
priority_queue<pair<int,int> >q;
q.push(make_pair(0,1));
dis[1]=0;
while(!q.empty()){
int now=q.top().second;
q.pop();
if(vis[now])continue;
vis[now]=1;
for(int i=0;i<e2[now].size();i++){
int to=e2[now][i].to;
if(dis[to]>dis[now]+e2[now][i].w){
dis[to]=dis[now]+e2[now][i].w;
q.push(make_pair(-dis[to],to));
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
while(m--){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
edge.to=y;edge.w=z;
e[x].push_back(edge);
edge.to=x;edge.w=z;
e2[y].push_back(edge);
}
Dijkstra();
for(int i=1;i<=n;i++)
sum+=dis[i];
fDijkstra();
for(int i=1;i<=n;i++)
sum+=dis[i];
printf("%d\n",sum);
}