文章

60

粉丝

361

获赞

43

访问

527.7k

头像
一点点变形
P1224 北京大学机考题
发布于2021年1月26日 15:24
阅读数 9.0k

#include<iostream>
#include<string>
#include<string.h>
#include<vector>
#include<stdio.h>
#include <queue>
#include<algorithm>
using namespace std;
const int maxn=105;

struct Edge
{
	int u;
	int v;
	int dis;
	Edge(int a,int b,int c):u(a),v(b),dis(c){}
};

vector<Edge>G[maxn];
int inq[maxn],d[maxn],yi[maxn],flag[maxn];
void init()
{
	for(int i=0;i<maxn;i++)G[i].clear();
	for(int i=0;i<maxn;i++)d[i]=1e9;
	for(int i=0;i<maxn;i++)inq[i]=0;
	for(int i=0;i<maxn;i++)flag[i]=0;
}
void spfa(int s,int n)
{
	queue<int>q;
	q.push(s);inq[s]=1;d[s]=0;
	while(!q.empty())
	{
		int now=q.front();
		q.pop(),inq[now]=0;
		
		//遍历所有边
		for(int i=0;i<G[now].size();i++)
		{
			int v=G[now][i].v;
			flag[now]+=abs(yi[now]-yi[v]);
			if(flag[now]>1)
			{
				flag[now]--;
				continue;
			}
			//松弛操作
			if(d[v]>d[now]+G[now][i].dis)
			{
				d[v]=d[now]+G[now][i].dis;
				if(inq[v]...
登录查看完整内容


登录后发布评论

7 条评论
Dear_Mr_He VIP
2022年7月4日 16:42

这个方法不太对吧?

比如数据:

3
3
1 2 200
1 3 5
2 3 10
1 2 2

路线应该是1->3->2,花费的最少时间为15,而你这种方法的路线是直接1->2,花费了200的时间。。

赞(1)

admin : 回复 Dear_Mr_He: 数据已加强,加上了极限数据,以前的代码可能会超时

2022年7月4日 20:57

Dear_Mr_He : 回复 admin: 嗯?难道不是以前通过的代码思路有问题吗?

2022年7月4日 23:31

admin : 回复 Dear_Mr_He: 他应该是题意理解错了,建图的时候阵营1到阵营2应该建单向边。

2022年7月5日 09:52

Dear_Mr_He : 回复 admin: 嗯,不过这样也过了说明测试数据没设计好。

2022年7月5日 10:16

admin : 回复 Dear_Mr_He: 是的,发现之后已第一时间加强,感谢提醒。

2022年7月5日 10:58

Dear_Mr_He : 回复 admin: 不客气。

2022年7月5日 11:16