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

最短路+枚举每一条边的情况 附AC代码,之前WA了n次,最后发现没有对mp数组memset

Posted by weihaohaoren at 2012-05-23 20:23:09 on Problem 1135
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#include<queue>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0);
int n,m;
vector<int> p[501];
int mp[501][501];
int dis[501];
bool inque[501];
void bfs()
{
	memset(dis,0x38,sizeof dis);
	dis[1]=0;
	queue<int> q;
	q.push(1);
	inque[1]=true;
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		inque[x]=false;
		for(int i=0;i<p[x].size();i++)
		{
			int y=p[x][i];
			if(dis[y]>dis[x]+mp[x][y])
			{
				dis[y]=dis[x]+mp[x][y];
				if(!inque[y])
				{
					inque[y]=true;
					q.push(y);
				}
			}
		}
	}
	double ans=0;
	int mi=1,mj=0;
	for(int i=1;i<n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			if(mp[i][j]==0) continue;
			if(abs(dis[i]-dis[j])>=mp[i][j])
			{
				if(max(dis[i],dis[j])>ans)
				{
					ans=max(dis[i],dis[j]);
					if(dis[i]>dis[j])
					{
						mi=i;
					}
					else
					{
						mi=j;
					}
					mj=0;
				}
			}
			else
			{
				int cha=max(dis[i],dis[j])-min(dis[i],dis[j]);
				double time=min(dis[i],dis[j])+cha;
				time+=(mp[i][j]-cha)/2.0;
				if(time>ans)
				{
					ans=time;
					mi=i;
					mj=j;
				}
			}
		}
	}
	if(mj)
	{
		printf("The last domino falls after %.1f seconds, between key dominoes %d and %d.\n",ans,mi,mj);
	}
	else
	{
		printf("The last domino falls after %.1f seconds, at key domino %d.\n",ans,mi);
	}
}
int main()
{
	freopen("input.txt","r",stdin);
	int tc=0;
	for(;;)
	{
		tc++;
		scanf("%d%d",&n,&m);
		if(!n) break;
		for(int i=1;i<=n;i++) p[i].clear();
		memset(mp,0,sizeof mp);
		while(m--)
		{
			int a,b,c;
			scanf("%d%d%d",&a,&b,&c);
			p[a].push_back(b);
			p[b].push_back(a);
			mp[a][b]=c;
			mp[b][a]=c;
		}
		printf("System #%d\n",tc);
		bfs();
		printf("\n");
	}
	fclose(stdin);
	return 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