| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
spfa+vec
///先将边存下来在正反分别搜一遍即可
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
#include<vector>
#include<iostream>
#define inf 2000000000
#define maxn 1100000
using namespace std;
struct Edge
{
int from,to,cost;
}save[maxn];
vector<int> G[maxn];
vector<Edge> edges;
int dis[maxn],cnt[maxn],n;
bool inq[maxn];
void init()
{
for(int i=0; i<=n; i++)
G[i].clear();
edges.clear();
}
void addEdge(int from,int to,int cost)
{
Edge eg;
eg.from=from;
eg.to=to;
eg.cost=cost;
edges.push_back(eg);
int m=edges.size();
G[eg.from].push_back(m-1);
}
bool spfa(int s)
{
for(int i=0; i<=n; i++)dis[i]=inf;
memset(cnt,0,sizeof(cnt));
memset(inq,0,sizeof(inq));
queue<int> que;
que.push(s);
dis[s]=0;
cnt[s]=1;
inq[s]=true;
while(!que.empty())
{
int tp=que.front();
que.pop();
inq[tp]=false;
for(int i=0; i<G[tp].size(); i++)
{
Edge eg = edges[G[tp][i]];
if(dis[eg.from]<inf&&dis[eg.to]>dis[eg.from]+eg.cost)
{
dis[eg.to]=dis[eg.from]+eg.cost;
if(!inq[eg.to])
{
que.push(eg.to);
inq[eg.to]=true;
if(++cnt[eg.to]>n)return false;
}
}
}
}
return true;
}
int main()
{
int t,q;
while(~scanf("%d",&t))
{
while(t--)
{
scanf("%d%d",&n,&q);
for(int i=1; i<=q; i++)
{
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
save[i].from=u,save[i].to=v,save[i].cost=c;
}
long long ans=0;
///1
init();
for(int i=1;i<=q;i++)
addEdge(save[i].from,save[i].to,save[i].cost);
spfa(1);
for(int i=1;i<=n;i++)ans+=dis[i];
///2
init();
for(int i=1;i<=q;i++)
addEdge(save[i].to,save[i].from,save[i].cost);
spfa(1);
for(int i=1;i<=n;i++)ans+=dis[i];
printf("%lld\n",ans);
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator