Question Link
SPFA algorithm
最短路建立反图和正图,均是以1为起点。
Time: 1969ms
Memory: 49084kB
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<ctime>
using namespace std;
#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)
#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)
#define mset(var,val) memset(var,val,sizeof(var))
#define LL long long
#define eps 0.000001
#define inf 0x7f7f7f7f
#define llinf 1e18
#define exp 0.000001
#define pai 3.141592654
#define random(x) rand()%(x)
#define lowbit(x) x&(-x)
inline int read()
{
int x=0,y=1;char a=getchar();while ( a>'9' || a<'0'){if ( a=='-')y=-1;a=getchar();}
while ( a>='0' && a<='9' ){ x=(x<<3)+(x<<1)+a-'0'; a=getchar();}return x*y;
}
#define M 1000009
struct node {
int u,v,w,nx;
}e1[M],e2[M];int hea1[M],hea2[M];int tot1,tot2;
int n,m;int dis1[M],dis2[M]; bool inq1[M],inq2[M];
inline void addead1(int u,int v,int w){
++tot1; e1[tot1].w = w; e1[tot1].u = u; e1[tot1].v = v; e1[tot1].nx = hea1[u]; hea1[u] = tot1;
}
inline void addead2(int u,int v,int w){
++tot2; e2[tot2].w = w; e2[tot2].u = u; e2[tot2].v = v; e2[tot2].nx = hea2[u]; hea2[u] = tot2;
}
void init(){
tot1 = tot2 = 0;
mset(inq1,0); mset(inq2,0);
mset(dis1,0x3f); mset(dis2,0x3f);
mset(hea1,0); mset(hea2,0);
}
long long SPFA1(){
queue< int >q;
dis1[ 1 ] = 0; inq1[ 1 ] = 1; q.push(1);
while ( !q.empty() ){
int u = q.front(); q.pop();
inq1[ u ] = 0;
for (int i = hea1[ u ]; i ; i = e1[i].nx ){
if ( dis1[ e1[i].v ] > dis1[ e1[i].u ] + e1[i].w ){
dis1[ e1[i].v ] = dis1[ e1[i].u ] + e1[i].w ;
if ( !inq1[ e1[i].v ] ){
q.push( e1[i].v );
inq1[ e1[i].v ] = 1;
}
}
}
}
LL ans = 0;
rep(i,1,n) ans += dis1[i];
return ans;
}
long long SPFA2(){
queue< int >q;
dis2[ 1 ] = 0; inq2[ 1 ] = 1; q.push(1);
while ( !q.empty() ){
int u = q.front(); q.pop();
inq2[ u ] = 0;
for (int i = hea2[ u ]; i ; i = e2[i].nx ){
if ( dis2[ e2[i].v ] > dis2[ e2[i].u ] + e2[i].w ){
dis2[ e2[i].v ] = dis2[ e2[i].u ] + e2[i].w ;
if ( !inq2[ e2[i].v ] ){
q.push( e2[i].v );
inq2[ e2[i].v ] = 1;
}
}
}
}
LL ans = 0;
rep(i,1,n) ans += dis2[i];
return ans;
}
int main()
{
// freopen("1.txt","r",stdin);
srand((int)time(0));
// std::ios::sync_with_stdio(false);
int T; T = read();
rep(aai,1,T){
init();
n = read(); m = read();
rep(i,1,m){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addead1(u,v,w);
addead2(v,u,w);
}
printf("%lld\n",SPFA1()+SPFA2());
}
return 0;
}
Dijkstra algorithm
Time
2063ms
Memory
47156kB
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<ctime>
using namespace std;
#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)
#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)
#define mset(var,val) memset(var,val,sizeof(var))
#define LL long long
#define eps 0.000001
#define inf 0x7f7f7f7f
#define llinf 1e18
#define exp 0.000001
#define pai 3.141592654
#define random(x) rand()%(x)
#define lowbit(x) x&(-x)
inline int read()
{
int x=0,y=1;char a=getchar();while ( a>'9' || a<'0'){if ( a=='-')y=-1;a=getchar();}
while ( a>='0' && a<='9' ){ x=(x<<3)+(x<<1)+a-'0'; a=getchar();}return x*y;
}
#define M 1000009
struct node {
int u,v,w,nx;
}e1[M],e2[M];int hea1[M],hea2[M];int tot1,tot2;
int n,m;int dis1[M],dis2[M];
inline void addead1(int u,int v,int w){
++tot1; e1[tot1].w = w; e1[tot1].u = u; e1[tot1].v = v; e1[tot1].nx = hea1[u]; hea1[u] = tot1;
}
inline void addead2(int u,int v,int w){
++tot2; e2[tot2].w = w; e2[tot2].u = u; e2[tot2].v = v; e2[tot2].nx = hea2[u]; hea2[u] = tot2;
}
void init(){
tot1 = tot2 = 0;
mset(dis1,0x3f); mset(dis2,0x3f);
mset(hea1,0); mset(hea2,0);
}
struct heapnode{
int v,d;
bool operator < (const heapnode& rhs )const {
return d < rhs.d;
}
heapnode (int vv,int dd):v(vv),d(dd){}
heapnode (){}
};
long long Dijkstra1(){
priority_queue<heapnode>q;
dis1[ 1 ] = 0;
q.push( heapnode(1,0) );
while ( !q.empty() ){
heapnode x = q.top(); q.pop();
int u = x.v;
if ( dis1[u] != x.d ) continue;
for (int i = hea1[ u ]; i ; i = e1[i].nx ){
if ( dis1[ e1[i].v ] > dis1[ e1[i].u ] + e1[i].w ){
dis1[ e1[i].v ] = dis1[ e1[i].u ] + e1[i].w ;
q.push( heapnode( e1[i].v,dis1[ e1[i].v ] ) );
}
}
}
LL ans = 0;
rep(i,1,n) ans += dis1[i];
return ans;
}
long long Dijkstra2(){
priority_queue<heapnode>q;
dis2[ 1 ] = 0;
q.push( heapnode(1,0) );
while ( !q.empty() ){
heapnode x = q.top(); q.pop();
int u = x.v;
if ( dis2[u] != x.d ) continue;
for (int i = hea2[ u ]; i ; i = e2[i].nx ){
if ( dis2[ e2[i].v ] > dis2[ e2[i].u ] + e2[i].w ){
dis2[ e2[i].v ] = dis2[ e2[i].u ] + e2[i].w ;
q.push( heapnode( e2[i].v,dis2[ e2[i].v ] ) );
}
}
}
LL ans = 0;
rep(i,1,n) ans += dis2[i];
return ans;
}
int main()
{
// freopen("1.txt","r",stdin);
srand((int)time(0));
// std::ios::sync_with_stdio(false);
int T; T = read();
rep(aai,1,T){
init();
n = read(); m = read();
rep(i,1,m){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addead1(u,v,w);
addead2(v,u,w);
}
printf("%lld\n",Dijkstra1()+Dijkstra2());
}
return 0;
}