您的位置:首页 > 其它

poj 1511 Invitation Cards

2011-09-14 11:50 281 查看
题意;求从源点到其余各点以及其他点到源点的距离之和

思路:分别正向建图 和反向建图  各求一次最短路径

dijkstra

#include<iostream> //dijkstra
#include<queue>
using namespace std;
int nodenum,edgenum;
int size;
__int64 dist1[1000050],dist2[1000050];
#define INF 1000000050;
struct node
{
int e;
int v;
int next;
}edge[20000003];
struct node2
{
int k;
__int64 v;
bool operator < (node2 a) const{
return v > a.v;
}
};
int adj1[1000003],adj2[1000003];
void add_edge(int s,int e,int v,int adj[])
{
edge[size].e = e;
edge[size].v = v;
edge[size].next = adj[s];
adj[s] = size++;
}
void dijkstra(int adj[],__int64 dist[])
{
priority_queue<node2> que;
int i;
for(i = 0;i <= nodenum;i++)
dist[i] = INF;
dist[1] = 0;
node2 cur;
cur.k = 1;cur.v = 0;
que.push(cur);
int v,e;
while(!que.empty())
{
cur = que.top();
que.pop();
for(i = adj[cur.k];i != -1;i = edge[i].next)
{
v = edge[i].v;
e = edge[i].e;
if(dist[e] > dist[cur.k] + v)
{
dist[e] = dist[cur.k] + v;
node2 tmp;
tmp.k = e;tmp.v = v;
que.push(tmp);
}
}
}
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&nodenum,&edgenum);
int i;
for(i = 0;i <= nodenum;i++)
{
adj1[i] = -1;
adj2[i] = -1;
}
size = 0;
int a,b,c;
for(i = 1;i <= edgenum;i++)
{
scanf("%d%d%d",&a,&b,&c);
add_edge(a,b,c,adj1);
add_edge(b,a,c,adj2);
}
dijkstra(adj1,dist1);
dijkstra(adj2,dist2);
__int64 sum = 0;
for(i = 2;i <= nodenum;i++)
sum += (dist1[i] + dist2[i]);
printf("%I64d\n",sum);
}
return 0;
}

spfa
#include<iostream>
#include<queue>
using namespace std;
#define INF 1000000000;
int nodenum,edgenum,size;
int dist[1000003],visited[1000003],adj1[1000003],adj2[1000003];
struct node //数组表示邻接表
{
int e,v,next;//终点,权值,下一个点
}head[2000003];
void add(int s,int e,int v,int adj[])
{
head[size].e = e;
head[size].v = v;
head[size].next = adj[s];
adj[s] = size++;
}
/*int relax(int s,int e,int v)
{
if(dist[s] + v < dist[e])
{
dist[e] = dist[s] + v;
return 1;
}
return 0;
}*/
void SPFA(int adj[])
{
queue<int> que;
int i;
for(i = 0;i <= nodenum;i++)
dist[i] = INF;
dist[1] = 0;
que.push(1);
visited[1] = 1;
int u,v,w;
while(!que.empty())
{
u = que.front();
que.pop();
visited[u] = 0;
for(i = adj[u];i != -1;i = head[i].next)
{
v = head[i].v;
w = head[i].e;
if(dist[u] + v < dist[w])
{
dist[w] = dist[u] + v;
if(!visited[w])
{
visited[w] = 1;
que.push(w);
}
}
}
}
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&nodenum,&edgenum);
int i,a,b,c;
size = 0;
memset(adj1,-1,sizeof(adj1));
memset(adj2,-1,sizeof(adj2));
for(i = 1;i <= edgenum;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c,adj1);
add(b,a,c,adj2);
}
__int64 sum = 0;
memset(visited,0,sizeof(visited));
SPFA(adj1);
for(i = 2;i <= nodenum;i++)
sum += dist[i];
memset(visited,0,sizeof(visited));
SPFA(adj2);
for(i = 2;i <= nodenum;i++)
sum += dist[i];
printf("%I64d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct c