poj1511

来源:互联网 发布:win10升级助手windows 编辑:程序博客网 时间:2024/05/18 01:55
//  Created by JamesQi in 2015.//  Copyright (c) 2015 JamesQi. All rights reserved.//poj1511,两次spfa求和,主要是考链式前向星,用邻接表会超时,还有就是建立反向边;#include <cstdio>#include <cstdlib>#include <iostream>#include <algorithm>#include <cstring>#include <climits>#include <string>#include <vector>#include <cmath>#include <stack>#include <queue>#include <set>#include <map>using namespace std;const int inf=0x3f3f3f3f;const int maxn=1e6+10;struct Edge{int v,cost,next;}edge[maxn],sedge[maxn];int head[maxn],hand[maxn];int cnt;int ans;int dp[maxn];int n,m;void addedge(int u,int v,int c){edge[cnt].v=v;edge[cnt].cost=c;edge[cnt].next=head[u];head[u]=cnt++;sedge[ans].v=u;sedge[ans].cost=c;sedge[ans].next=hand[v];hand[v]=ans++;return ;}void spfa1(){//int dp[maxn];bool vis[maxn];memset(vis,false,sizeof vis);memset(dp,inf,sizeof dp);queue<int> que;while(!que.empty()) que.pop();vis[1]=true;dp[1]=0;que.push(1);while(!que.empty()){int u=que.front();que.pop();vis[u]=false;for (int i=head[u];i!=-1;i=edge[i].next){Edge& e=edge[i];if (dp[e.v]>dp[u]+e.cost){dp[e.v]=dp[u]+e.cost;if (!vis[e.v]){vis[e.v]=true;que.push(e.v);}}}}/*int tot=0;for (int i=1;i<=n;i++)tot+=dp[i];//printf("spfa1=%d\n",tot);return tot;*/return ;}void spfa2(){queue<int> que;while(!que.empty()) que.pop();//int dp[maxn];bool vis[maxn];memset(dp,inf,sizeof dp);memset(vis,false,sizeof vis);que.push(1);vis[1]=true;dp[1]=0;while(!que.empty()){int u=que.front();que.pop();vis[u]=false;for (int i=hand[u];i!=-1;i=sedge[i].next){Edge& e=sedge[i];if (dp[e.v]>dp[u]+e.cost){dp[e.v]=dp[u]+e.cost;if (!vis[e.v]){que.push(e.v);vis[e.v]=true;}}}}/*int tot=0;for (int i=1;i<=n;i++)tot+=dp[i];//printf("spfa2=%d\n",tot);return tot;*/return ;}int main(){//ios::sync_with_stdio(false);//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);int t;scanf("%d",&t);while(t--){memset(head,-1,sizeof head);memset(hand,-1,sizeof hand);scanf("%d%d",&n,&m);cnt=ans=0;int a,b,c;for (int i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);addedge(a,b,c);}long long sum=0;spfa1();for (int i=2;i<=n;i++)sum+=dp[i];spfa2();for (int i=2;i<=n;i++)sum+=dp[i];printf("%lld\n",sum);}return 0;}


0 0
原创粉丝点击