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

Re:没给Q的大小,所以我做N次单元最短路,存一个二元矩阵,O(n*ke),过不了,求大神看看联系QQ362697076!!!!

Posted by cl__xy at 2012-07-18 16:32:22 on Problem 4046
In Reply To:Re:没给Q的大小,所以我做N次单元最短路,存一个二元矩阵,O(n*ke),过不了,求大神看看!!!! Posted by:cl__xy at 2012-07-18 16:11:21
> #include<stdio.h>
> #include<string.h>
> #include<stdlib.h>
> #include<iostream>
> #include<algorithm>
> using namespace std;
> #define M 1010
> int n,m,tot,head[M*2],mark[M],mm[M],Q[M*M];
> __int64 dis[M][M];
> __int64 oo,kk;
> struct node
> {
> 	int to,next;
> 	__int64 cost;
> }edge[M*100];
> struct rest
> {
> 	__int64 val;
> 	int n;
> }res[M];
> bool cmp(rest a,rest b)
> {
> 	return a.val>b.val;
> }
> int add(int a,int b,__int64 c)
> {
> 	edge[tot].to=b;edge[tot].cost=c;edge[tot].next=head[a];head[a]=tot++;
> 	edge[tot].to=a;edge[tot].cost=c;edge[tot].next=head[b];head[b]=tot++;
> 	return 0;
> }
> int spfa(int x,__int64 xx)
> {
> 	int i,j;
> 	for(i=1;i<=n;i++)
> 	{
> 		if(!mm[i])
> 		{
> 			dis[x][i]=oo;
> 		}
> 		mark[i]=0;
> 	}
> 	int l,r;
> 	l=r=0;
> 	Q[r++]=x;
> 	mark[x]=1;
> 	dis[x][x]=xx;
> 	
> 	while(l<r)
> 	{
> 		int u=Q[l++];
> 		if(!mm[u])mark[u]=0;//printf("****\n");
> 		for(i=head[u];i!=-1;i=edge[i].next)
> 		{
> 			int y=edge[i].to;
> 			if(mm[y]&&!mark[y])
> 			{
> 				dis[x][y]=dis[y][x];
> 				Q[r++]=y;
> 				mark[y]=1;
> 				continue;
> 			}
> 			else if(dis[x][u]+edge[i].cost<dis[x][y])
> 			{
> 				dis[x][y]=dis[x][u]+edge[i].cost;
> 				if(!mark[y])Q[r++]=y,mark[y]=1;
> 			}
> 		}
> 	}
> 	return 0;
> }
> 
> 
> int main()
> {
> 	int i,j;
> 	kk=2000000010;
> 	oo=kk*200100;
> 	//cout<<oo<<endl;
> 	while(scanf("%d%d",&n,&m))
> 	{
> 		if(n==0&&m==0)break;
> 		for(i=0;i<n;i++)
> 		{
> 			res[i].n=i+1;
> 			scanf("%I64d",&res[i].val);
> 			//val[i+1]=res[i].val;
> 		}
> 		sort(res,res+n,cmp);
> 		memset(head,-1,sizeof(head));
> 		memset(mm,0,sizeof(mm));
> 		int a,b;
> 		__int64 c;
> 		tot=0;
> 		while(m--)
> 		{
> 			scanf("%d%d%I64d",&a,&b,&c);
> 			add(a,b,c);
> 		}
> 		for(i=0;i<n;i++)
> 		{
> 			
> 			mm[res[i].n]=1;
> 			spfa(res[i].n,res[i].val);
> 			for(j=0;j<i;j++)
> 			dis[res[i].n][res[j].n]=dis[res[j].n][res[i].n];
> 		//	printf("**");		
> 		}
> 		int pro;
> 		/*for(i=1;i<=n;i++)
> 		{
> 			for(j=1;j<=n;j++)
> 			printf("%I64d ",dis[i][j]);
> 			printf("\n");
> 		}*/
> 		scanf("%d",&pro);
> 		while(pro--)
> 		{
> 			scanf("%d%d",&a,&b);
> 			if(dis[a][b]<oo)printf("%I64d\n",dis[a][b]);
> 			else printf("-1\n");
> 		}
> 		printf("\n");
> 	}
> }
> /*
> 6 7
> 1 2 3 4 5 6
> 1 2 1
> 2 3 2
> 3 4 3
> 4 5 4
> 1 5 5
> 2 5 2
> 1 4 3
> 5
> 1 4
> 2 3
> 1 5
> 3 5
> 1 6
> 2 1
> 10 20
> 1 2 5
> 1
> 1 2
> 0 0
> */

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