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
- poj1511
- poj1511
- poj1511
- poj1511
- POJ1511
- POJ1511 SPFA
- poj1511 spfa
- poj1511 spfa
- poj1511(spfa)
- poj1511(SPFA)
- POJ1511 Subway
- HDU1535/POJ1511
- poj1511 spfa
- POJ1511 Invitation Cards
- poj1511 - Invitation Cards
- POJ1511 SPFA经典题目
- poj1511 Invitation Cards
- POJ1511 Invitation Cards【SPFA】
- 加速Android Studio/Gradle构建
- FileWriter的使用
- Android Studio 快捷键
- 装饰者设计模式
- 使用了未经检查或不安全的操作
- poj1511
- 代码笔记——Toast显示文本,图片,图文
- asp.net中使用AutoCompleteExtender具体方法
- Android 可拖动的进度条:SeekBar之简单使用
- DDoS 分布式拒绝服务攻击
- 循环链表的表示与实现
- SequenceInputStream(序列流)
- 对象的输入输出流
- houdini 保存瞬间值的方法