Time Limit: 8000MS | Memory Limit: 262144K | |
Total Submissions: 8425 | Accepted: 2617 |
Description
Input
Output
Sample Input
2 2 2 1 2 13 2 1 33 4 6 1 2 10 2 1 60 1 3 20 3 4 10 2 4 5 4 1 50
Sample Output
46 210
Source
稀疏图,点到了10的6次方
当然用SPFA比较方便
首先一遍扫1到其他点的距离,另一遍将所有边反向,即可得到其他点到1的距离
2次SPFA!时间一般,1.7S
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int E=1000000*2;
const int V=1000010;
const int INF=0x7fffffff;
struct EDGE
{
int link,next;
__int64 val;
}edge[E],node[V];
int head[V],e;
__int64 dist[V];
bool vis[V];
queue<int> q;
int m;
void addedge(int x,int y,__int64 c)
{
edge[e].link=y;
edge[e].val=c;
edge[e].next=head[x];
head[x]=e++;
}
__int64 SPFA(int src,int n)
{
int u,v;
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++) dist[i]=INF;
dist[src]=0;
vis[src]=true;
while(!q.empty()) q.pop();
q.push(src);
while(!q.empty())
{
u=q.front();
q.pop();
vis[u]=false;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].link;
if(dist[u]+edge[i].val<dist[v])
{
dist[v]=dist[u]+edge[i].val;
if(!vis[v])
{
q.push(v);
vis[v]=true;
}
}
}
}
__int64 sum=0;
for(int i=2;i<=n;i++)
sum+=dist[i];
return sum;
}
void buildgraph()
{
e=0;
memset(head,-1,sizeof(head));
for(int i=0;i<m;i++) addedge(node[i].link,node[i].next,node[i].val);
}
void buildgraph2()
{
e=0;
memset(head,-1,sizeof(head));
for(int i=0;i<m;i++) addedge(node[i].next,node[i].link,node[i].val);
}
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
int x,y;
int c;
scanf("%d%d%d",&x,&y,&c);
node[i].link=x;
node[i].next=y;
node[i].val=c;
}
buildgraph();
__int64 s1=SPFA(1,n);
buildgraph2();
__int64 s2=SPFA(1,n);
printf("%I64d/n",s1+s2);
}
return 0;
}