Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

wa了一次,没注意输出no answer;tle一次,因为spfa用了栈,改用队列610ms水过。代码如下

Posted by zengshiyuan at 2014-03-23 20:05:51 on Problem 3013
#include<cstdio>
#include<cstring>
using namespace std;
const long long inf=9999999999;
int first[50001],nxt[100001],edge[100001],val[100001],w[50001],e,v,num;
long long dis[50001];
bool vis[50001];
void add(int a,int b,int c)
{
	edge[++num]=b;
	val[num]=c;
	nxt[num]=first[a];
	first[a]=num;
}
void spfa()
{
	int q[50000],head,tail,i,j;
	for(i=1;i<=v;i++) dis[i]=inf,vis[i]=0;
	q[1]=1;
	head=1;
	tail=2;
	dis[1]=0;
	vis[1]=1;
	while(head!=tail)
	{
		i=q[head];
		head=(head+1)%50000;
		j=first[i];
		vis[i]=0;
		while(j)
		{
			if(dis[edge[j]]>dis[i]+val[j])
			{
				dis[edge[j]]=dis[i]+val[j];
				if(!vis[edge[j]])
				{
					q[tail]=edge[j];
					tail=(tail+1)%50000;
					vis[edge[j]]=1;
				}
			}
			j=nxt[j];
		}
	}
}
int main()
{
	int i,t,a,b,c;
	long long ans;
	bool f;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&v,&e);
		for(i=1;i<=v;i++) scanf("%d",&w[i]);
		memset(first,0,sizeof(first));
		memset(nxt,0,sizeof(nxt));
		num=0;
		for(i=1;i<=e;i++)
		{
			scanf("%d%d%d",&a,&b,&c);
			add(a,b,c);
			add(b,a,c);
		}
		spfa();
		ans=0;
		f=0;
		for(i=2;i<=v;i++) 
			if (dis[i]<inf) ans+=dis[i]*w[i];
			else 
			{
				f=1;
				break;
			}
		if(f) printf("No Answer\n");
		else printf("%lld\n",ans);
	}
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator