POJ 1511 邻接表加spfa,刚开始未用邻接表构图,然后TLE到死啊、、、、、、

http://poj.org/problem?id=1511

题目大意:一群人从七点出发到各个点的花费,是一副有向图,可以构造正向与反向两幅图,然后用spfa加邻接表、、接下来几天我得给floyd、bellmanford 、dijkstra、spfa好好做个总结。

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define ll __int64
#define inf 4000000000


struct edge{
	ll next;
	ll to;
	ll side;
	
};
edge e[1000002],e1[1000002];
ll p1[1000002], p2[1000002];
ll head[1000002], tot,tot1,head1[1000002];
int k[1000002];

void add(ll a, ll b, ll c)
{
	e[tot].to=b;
	e[tot].side=c;
	e[tot].next=head[a];
//	printf("e[%I64d]=head1[%I64d]=%I64d ",tot,a,head[a]);//把输入的各项值保存下来其实这边add与add1其实只要一个就行,
//	printf("%I64d",a);
	head[a]=tot++;
//	printf("head[%I64d]=%I64d",a,tot);
 //   printf("\n");
	
}
void add1(ll a, ll b, ll c)
{


    e1[tot1].to=b;
	e1[tot1].side=c;
	e1[tot1].next=head1[a];
//	printf("%I64d\n",head1[a]);
//	printf("e1[%I64d]=head1[%I64d] ",tot1,a,head1[a]);
	head1[a]=tot1++;
//	printf("head1[%I64d]=%I64d",a,tot1-1);
  //  printf("\n");

}



int main()
{
	ll N;
	scanf("%I64d",&N);
	
	ll i,j;
	
	for(i=1;i<=N;i++)
	{
		ll P,Q;
		tot=0;
			tot1=0;
		
		scanf("%I64d%I64d",&P,&Q);
		for(j=1;j<=P;j++)
		{
			//e[j].side=inf;
			head[j]= -1;
			head1[j]=-1;
		}
	//	printf("%I64d\n",head[1]);
		for(j=1;j<=Q;j++)
		{
			ll a,b,c;
			scanf("%I64d%I64d%I64d",&a,&b,&c);
			add(a,b,c);
			add1(b,a,c);
			
		}
		for(j=1;j<=P;j++)
		{
			p1[j]=inf;
			p2[j]=inf;
			k[j]=0;
		}
		
		p1[1]=0;
		p2[1]=0;
		
		queue<ll> q;//队列
		q.push(1); //放入起始点
		while(!q.empty())
		{
			int t;
			t=q.front();
			q.pop();
			k[t]=0;
			for(j=head[t];j!=-1;j=e[j].next)
			{
				ll p=e[j].to;								
				if(p1[p]>p1[t]+e[j].side)
				{
					p1[p]=p1[t]+e[j].side;
					if(k[p]==0)
					{
						q.push(p);
						k[p]=1;
					}
				}
				
			}
		}
		//while(!q.empty())
          //        q.pop();
		//	printf("%I64d",p1[P-1]);
		q.push(1);
		for(j=1;j<=P;j++)				
			k[j]=0;


		while(!q.empty())
		{
			int t;
			t=q.front();
			q.pop();
			k[t]=0;
			for(j=head1[t];j!=-1;j=e1[j].next)
			{//printf("123");
				ll p=e1[j].to;
				if(p2[p]>p2[t]+e1[j].side)
				{
					p2[p]=p2[t]+e1[j].side;
					if(k[p]==0)
					{
						q.push(p);
						k[p]=1;
					}
				}
				
			}
		
		}		
		ll  sum=0;
			for(j=2;j<=P;j++)	
				sum+=p1[j]+p2[j];
	    	printf("%I64d\n",sum);

	}
	return 0;
}



/*
1
2 2
1 2 13
2 1 33
1
4 6
1 2 10
2 1 60
1 3 20
3 4 10
2 4 5
4 1 50
*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。
### 内容概要 这份《计算机试卷1》包含多个部分,主要覆盖了计算机基础知识、操作系统应用、文字处理、电子表格、演示文稿制作、互联网应用以及计算机多媒体技术。试卷以单选题开始,涉及计算机历史、基本概念、硬件组成、软件系统、网络协议等。接着是操作应用部分,要求考生在给定的软件环境中完成一系列具体的计算机操作任务。 ### 适用人群 本试卷适用于计算机科学与技术、信息技术相关专业的学生,以及准备计算机水平考试或职业资格认证的人士。它适合那些希望检验和提升自己计算机操作能力的学习者,也适用于教育工作者作为教学评估工具。 ### 使用场景及目标 1. **学习评估**:作为教育机构的课程评估工具,帮助教师了解学生对计算机基础知识的掌握程度。 2. **自学检验**:供个人自学者检验自己的计算机操作技能和理论知识,为进一步学习提供方向。 3. **职业发展**:为职场人士提供计算机技能的自我提升途径,增强其在信息时代的竞争力。 4. **考试准备**:为准备计算机相关考试的考生提供实战演练的机会,强考试自信。 5. **教学资源**:教师可以将其作为教学资源,设计课程和实验,提高教学效果。 试卷的目标是通过理论知识的测试和实践技能的操作,全面提升考生的计算机应用能力。考生应掌握从基础的计算机组成原理到复杂的数据处理、演示文稿制作、网络应用以及多媒体技术处理等多方面技能。通过本试卷的学习与练习,考生将能够更熟练地使用计算机解决实际问题,为未来的学术或职业生涯打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值