题目由于一些原因没法放出来
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
int n,m;
vector<vector<pair<int,int> > >g1(10002);
vector<vector<pair<int,int> > >g2(10002);
priority_queue<pair<int,int> > q;
bool vis[10002];
int ans[10002];
inline void mem(){
memset(vis,0,sizeof(vis));
for(int i=0; i<=10000; ++i)
ans[i]=999999999;
ans[1]=0;
}
int main(){
// freopen("invitation.in","r",stdin);
// freopen("invitation.out","w",stdout);
long long sum=0;
scanf("%d%d",&n,&m);
for(int i=1; i<=m; ++i)
{
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
g1[x].push_back(make_pair(y,w));
g2[y].push_back(make_pair(x,w));
}
mem();
vis[1]=1;
q.push(make_pair(1,0));
while(!q.empty())
{
pair<int,int> u=q.top();
q.pop();
if(u.second!=ans[u.first]) continue;
for(int i=0; i<g1[u.first].size(); ++i)
if(ans[g1[u.first][i].first]>ans[u.first]+g1[u.first][i].second){
ans[g1[u.first][i].first]=ans[u.first]+g1[u.first][i].second;
q.push(make_pair(g1[u.first][i].first,ans[g1[u.first][i].first]));
}
}
for(int i=1; i<=n; ++i)
sum+=ans[i];
mem();
q.push(make_pair(1,0));
while(!q.empty())
{
pair<int,int> u=q.top();
q.pop();
if(u.second!=ans[u.first]) continue;
for(int i=0; i<g2[u.first].size(); ++i)
if(ans[g2[u.first][i].first]>ans[u.first]+g2[u.first][i].second){
ans[g2[u.first][i].first]=ans[u.first]+g2[u.first][i].second;
q.push(make_pair(g2[u.first][i].first,ans[g2[u.first][i].first]));
}
}
for(int i=1; i<=n; ++i)
sum+=ans[i];
cout<<sum;
return 0;
}
如果不撤掉STL能过么