?? invitation cards(bellman ford優化).cpp
字號:
//1 <= V,E <= 1000000
//Dijkstra O(V*V) Bellman Ford O(V*E) 〉5s (TLE)
//Bellman Ford (優化) 1.46s
//Dijkstra&Heap 1.24s
//關于Dijkstra的優化:用堆維護使尋找需要擴展的點的過程復雜度降低為1。復雜度大幅降低。
//關于Bellman ford的優化:可以將Bellman ford需要擴展的點放進隊列中,擴展順序有了新的變化
#include <cstdio>
#include <string>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
struct node {
int e,v;
node(int a=0,int b=0) {
e = a;
v = b;
}
};
queue<int > SQ;
vector<vector<node> > map;
vector<vector<node> > nmap;
int n,p,q;
int dist[1000100];
int bellman_ford(vector<vector<node> > &path)
{
int i,j,k,sum,now,l;
node next;
while (!SQ.empty()) {
SQ.pop();
}
SQ.push(1);
dist[1] = 0;
for (i=0;i<p;i++) {
l = SQ.size();
if (l == 0) {
break;
}
while (l--) {
now = SQ.front();
SQ.pop();
for (j=path[now].size()-1;j>=0;j--) {
next = path[now][j];
if (dist[now]!=-1 && (dist[next.e]==-1 || dist[next.e] > dist[now]+next.v) ) {
dist[next.e] = dist[now]+next.v;
SQ.push(next.e);
}
}
}
}
sum = 0;
for (i=1;i<=p;i++) {
sum += dist[i];
}
return sum;
}
int main()
{
int i,j,a,b,c;
scanf("%d",&n);
while (n--) {
scanf("%d %d",&p,&q);
map.resize(p+10);
nmap.resize(p+10);
for (i=0;i<=p;i++) {
map[i].clear();
nmap[i].clear();
}
for (i=0;i<q;i++) {
scanf("%d %d %d",&a,&b,&c);
map[a].push_back(node(b,c) );
nmap[b].push_back(node(a,c) );
}
memset(dist,-1,sizeof(dist));
int ans1 = bellman_ford(map);
memset(dist,-1,sizeof(dist));
int ans2 = bellman_ford(nmap);
printf("%d\n",ans1+ans2);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -