POJ 1511 Invitation Cards 解题报告

24 篇文章 0 订阅
11 篇文章 0 订阅

Question Link

SPFA algorithm

最短路建立反图和正图,均是以1为起点。

Time: 1969ms
Memory: 49084kB
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<ctime>
using namespace std; 
#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)
#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)
#define mset(var,val)	 memset(var,val,sizeof(var))
#define LL long long 
#define eps 0.000001
#define inf 0x7f7f7f7f
#define llinf 1e18
#define exp 0.000001
#define pai 3.141592654
#define random(x)   rand()%(x)
#define lowbit(x)   x&(-x)
inline int read()
{
	int x=0,y=1;char a=getchar();while ( a>'9' || a<'0'){if ( a=='-')y=-1;a=getchar();}
	while ( a>='0' && a<='9' ){	x=(x<<3)+(x<<1)+a-'0'; a=getchar();}return x*y;
}
#define M 1000009

struct node {
	int u,v,w,nx; 
}e1[M],e2[M];int hea1[M],hea2[M];int tot1,tot2; 
int n,m;int dis1[M],dis2[M]; bool inq1[M],inq2[M];
inline void addead1(int u,int v,int w){
	++tot1; e1[tot1].w = w; e1[tot1].u = u; e1[tot1].v = v; e1[tot1].nx = hea1[u]; hea1[u] = tot1; 
}
inline void addead2(int u,int v,int w){
	++tot2; e2[tot2].w = w; e2[tot2].u = u; e2[tot2].v = v; e2[tot2].nx = hea2[u]; hea2[u] = tot2; 
}
void init(){
	tot1 = tot2 = 0; 
	mset(inq1,0);	mset(inq2,0);
	mset(dis1,0x3f);	mset(dis2,0x3f);
	mset(hea1,0); 	mset(hea2,0);
}
long long SPFA1(){
	queue< int  >q; 
	dis1[ 1 ] = 0; inq1[ 1 ] = 1; q.push(1);
	while ( !q.empty() ){
		int u = q.front(); q.pop();
		inq1[ u ] = 0; 
		for (int i = hea1[ u ]; i ; i = e1[i].nx ){
			if ( dis1[ e1[i].v ] > dis1[ e1[i].u ] + e1[i].w ){
				dis1[ e1[i].v ] = dis1[ e1[i].u ] + e1[i].w ;
				if ( !inq1[ e1[i].v ] ){
					q.push( e1[i].v );
					inq1[ e1[i].v ] = 1; 
				}
			}
		}
	}
	LL ans = 0; 
	rep(i,1,n)			ans += dis1[i];
	return ans; 
}
long long SPFA2(){
	queue< int  >q; 
	dis2[ 1 ] = 0; inq2[ 1 ] = 1; q.push(1);
	while ( !q.empty() ){
		int u = q.front(); q.pop();
		inq2[ u ] = 0; 
		for (int i = hea2[ u ]; i ; i = e2[i].nx ){
			if ( dis2[ e2[i].v ] > dis2[ e2[i].u ] + e2[i].w ){
				dis2[ e2[i].v ] = dis2[ e2[i].u ] + e2[i].w ;
				if ( !inq2[ e2[i].v ] ){
					q.push( e2[i].v );
					inq2[ e2[i].v ] = 1; 
				}
			}
		}
	}
	LL ans = 0; 
	rep(i,1,n)			ans += dis2[i];
	return ans; 
}
int main()
{
//	freopen("1.txt","r",stdin);
	srand((int)time(0));
//	std::ios::sync_with_stdio(false);
	int T; T = read();
	rep(aai,1,T){
		init();
		n = read(); m = read();
		rep(i,1,m){
			int u,v,w; 
			scanf("%d%d%d",&u,&v,&w);
			addead1(u,v,w);
			addead2(v,u,w);
		}
		printf("%lld\n",SPFA1()+SPFA2());
	}
	return 0;
}

Dijkstra algorithm

Time
2063ms
Memory
47156kB
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<ctime>
using namespace std; 
#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)
#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)
#define mset(var,val)	 memset(var,val,sizeof(var))
#define LL long long 
#define eps 0.000001
#define inf 0x7f7f7f7f
#define llinf 1e18
#define exp 0.000001
#define pai 3.141592654
#define random(x)   rand()%(x)
#define lowbit(x)   x&(-x)
inline int read()
{
	int x=0,y=1;char a=getchar();while ( a>'9' || a<'0'){if ( a=='-')y=-1;a=getchar();}
	while ( a>='0' && a<='9' ){	x=(x<<3)+(x<<1)+a-'0'; a=getchar();}return x*y;
}
#define M 1000009

struct node {
	int u,v,w,nx; 
}e1[M],e2[M];int hea1[M],hea2[M];int tot1,tot2; 
int n,m;int dis1[M],dis2[M];
inline void addead1(int u,int v,int w){
	++tot1; e1[tot1].w = w; e1[tot1].u = u; e1[tot1].v = v; e1[tot1].nx = hea1[u]; hea1[u] = tot1; 
}
inline void addead2(int u,int v,int w){
	++tot2; e2[tot2].w = w; e2[tot2].u = u; e2[tot2].v = v; e2[tot2].nx = hea2[u]; hea2[u] = tot2; 
}
void init(){
	tot1 = tot2 = 0; 
	mset(dis1,0x3f);	mset(dis2,0x3f);
	mset(hea1,0); 	mset(hea2,0);
}
struct heapnode{
	int v,d; 
	bool operator < (const heapnode& rhs )const {
		return d < rhs.d; 
	} 
	heapnode (int vv,int dd):v(vv),d(dd){}
	heapnode (){}
};
long long Dijkstra1(){
	priority_queue<heapnode>q;  
	dis1[ 1 ] = 0; 
	q.push( heapnode(1,0) );
	while ( !q.empty() ){
		heapnode x = q.top(); q.pop();
		int u = x.v; 
		if ( dis1[u] != x.d )	continue; 
		for (int i = hea1[ u ]; i ; i = e1[i].nx ){
			if ( dis1[ e1[i].v ] > dis1[ e1[i].u ] + e1[i].w ){
				dis1[ e1[i].v ] = dis1[ e1[i].u ] + e1[i].w ;
				q.push( heapnode( e1[i].v,dis1[ e1[i].v ] ) );	
			}
		}
	}
	LL ans = 0; 
	rep(i,1,n)			ans += dis1[i];
	return ans; 
}
long long Dijkstra2(){
	priority_queue<heapnode>q;  
	dis2[ 1 ] = 0; 
	q.push( heapnode(1,0) );
	while ( !q.empty() ){
		heapnode x = q.top(); q.pop();
		int u = x.v; 
		if ( dis2[u] != x.d )	continue; 
		for (int i = hea2[ u ]; i ; i = e2[i].nx ){
			if ( dis2[ e2[i].v ] > dis2[ e2[i].u ] + e2[i].w ){
				dis2[ e2[i].v ] = dis2[ e2[i].u ] + e2[i].w ;
				q.push( heapnode( e2[i].v,dis2[ e2[i].v ] ) );	
			}
		}
	}
	LL ans = 0; 
	rep(i,1,n)			ans += dis2[i];
	return ans; 
}
int main()
{
//	freopen("1.txt","r",stdin);
	srand((int)time(0));
//	std::ios::sync_with_stdio(false);
	int T; T = read();
	rep(aai,1,T){
		init();
		n = read(); m = read();
		rep(i,1,m){
			int u,v,w; 
			scanf("%d%d%d",&u,&v,&w);
			addead1(u,v,w);
			addead2(v,u,w);
		}
		printf("%lld\n",Dijkstra1()+Dijkstra2());
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值