http://poj.org/problem?id=1511
最短路问题
dijkstra邻接表+优先队列算法
正面算一次,反图算一次
题目明明说的不超long long
全部改成long long 才过
代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stack>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const long long maxn =1000000001;
long long first[1000005];
long long next[1000005];
long long Nfirst[1000005];
long long Nnext[1000005];
long long v[1000005];
long long u[1000005];
long long w[1000005];
long long p,q;
long long d[1000005];
long long down[1000005];
long long sum;
typedef pair<long long,long long> pii;
priority_queue<pii,vector<pii>,greater<pii> > que;
long long init()
{
for(long long i=1;i<=p;i++)
first[i]=Nfirst[i]=-1;
for(long long i=1;i<=q;i++)
next[i]=Nnext[i]=-1;
for(long long i=1;i<=p;i++)
d[i]=(i==1?0:maxn);
memset(down,0,sizeof(down));
while(!que.empty())
que.pop();
}
long long dijkstra()
{
while(!que.empty())
que.pop();
que.push(make_pair(d[1],1));
while(!que.empty())
{
pii k=que.top();
que.pop();
long long x=k.second;
if(down[k.second]==1)
continue;
down[k.second]=1;
for(long long e=first[x];e!=-1;e=next[e])
{
if(d[v[e]]>d[x]+w[e])
{
d[v[e]]=d[x]+w[e];
que.push(make_pair(d[v[e]],v[e]));
}
}
}
for(long long i=1;i<=p;i++)
if(d[i]!=maxn)
sum+=d[i];
for(long long i=1;i<=p;i++)
d[i]=(i==1?0:maxn);
memset(down,0,sizeof(down));
return 1;
}
long long Ndijkstra()
{
while(!que.empty())
que.pop();
que.push(make_pair(d[1],1));
while(!que.empty())
{
pii k=que.top();
que.pop();
long long x=k.second;
if(down[k.second]==1)
continue;
down[k.second]=1;
for(long long e=Nfirst[x];e!=-1;e=Nnext[e])
{
if(d[u[e]]>d[x]+w[e])
{
d[u[e]]=d[x]+w[e];
que.push(make_pair(d[u[e]],u[e]));
}
}
}
for(long long i=1;i<=p;i++)
if(d[i]!=maxn)
sum+=d[i];
}
int main()
{
long long T;
scanf("%I64d",&T);
while(T--)
{
sum=0;
scanf("%I64d%I64d",&p,&q);
init();
for(long long i=1;i<=q;i++)
{
scanf("%I64d%I64d%I64d",&u[i],&v[i],&w[i]);
next[i]=first[u[i]];
first[u[i]]=i;
Nnext[i]=Nfirst[v[i]];
Nfirst[v[i]]=i;
}
dijkstra();
Ndijkstra();
printf("%I64d\n",sum);
}
return 0;
}
SPFA算法
好像就一个用队列,一个用优先队列的区别
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stack>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const long long maxn =1000000001;
long long first[1000005];
long long next[1000005];
long long Nfirst[1000005];
long long Nnext[1000005];
long long v[1000005];
long long u[1000005];
long long w[1000005];
long long p,q;
long long d[1000005];
long long down[1000005];
long long sum;
queue<long long> que;
long long init()
{
for(long long i=1;i<=p;i++)
first[i]=Nfirst[i]=-1;
for(long long i=1;i<=q;i++)
next[i]=Nnext[i]=-1;
for(long long i=1;i<=p;i++)
d[i]=(i==1?0:maxn);
memset(down,0,sizeof(down));
}
long long dijkstra()
{
while(!que.empty())
que.pop();
que.push(1);
down[1]=1;
while(!que.empty())
{
long long x=que.front();
que.pop();
down[x]=0;
for(long long e=first[x];e!=-1;e=next[e])
{
if(d[v[e]]>d[x]+w[e])
{
d[v[e]]=d[x]+w[e];
if(down[v[e]]==0)
que.push(v[e]);
}
}
}
for(long long i=1;i<=p;i++)
if(d[i]!=maxn)
sum+=d[i];
for(long long i=1;i<=p;i++)
d[i]=(i==1?0:maxn);
memset(down,0,sizeof(down));
}
long long Ndijkstra()
{
while(!que.empty())
que.pop();
que.push(1);
down[1]=1;
while(!que.empty())
{
long long x=que.front();
que.pop();
down[x]=0;
for(long long e=Nfirst[x];e!=-1;e=Nnext[e])
{
if(d[u[e]]>d[x]+w[e])
{
d[u[e]]=d[x]+w[e];
if(down[u[e]]==0)
que.push(u[e]);
}
}
}
for(long long i=1;i<=p;i++)
if(d[i]!=maxn)
sum+=d[i];
}
int main()
{
long long T;
scanf("%I64d",&T);
while(T--)
{
sum=0;
scanf("%I64d%I64d",&p,&q);
init();
for(long long i=1;i<=q;i++)
{
scanf("%I64d%I64d%I64d",&u[i],&v[i],&w[i]);
next[i]=first[u[i]];
first[u[i]]=i;
Nnext[i]=Nfirst[v[i]];
Nfirst[v[i]]=i;
}
dijkstra();
Ndijkstra();
printf("%I64d\n",sum);
}
return 0;
}