求助分层图最短路
  • 板块学术版
  • 楼主pyyyyyy
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/5/5 11:25
  • 上次更新2023/11/7 03:07:52
查看原帖
求助分层图最短路
122557
pyyyyyy楼主2020/5/5 11:25

P1948 [USACO08JAN]Telephone Lines S

求助这道题

  • 一个问题是下面这份代码在#7测试点上WAWA了(输出1-1)
  • 另一个问题是有没有大佬给蒟蒻讲讲下面的代码什么意思
	for(int i=1;i<=p;++i)
	{
		int x,y,z;
		scanf("%d %d %d",&x,&y,&z);
		for(int j=0;j<=k;++j)
		{
			add(x+j*n,y+j*n,z);
			add(y+j*n,x+j*n,z);
		}
		for(int j=0;j<k;++j)
		{
			add(x+j*n,y+(j+1)*n,0);
			add(y+j*n,x+(j+1)*n,0);
		}
	}

错误的代码:


#include<bits/stdc++.h>
#include<queue>
using namespace std;
const int N=2020,P=10011,INF=0x3f3f3f;
struct node
{
	int v,Next,w;
}e[N*P];
int head[N*N],ecnt;
void add(int u,int v,int w)
{
	e[++ecnt].Next=head[u];
	head[u]=ecnt;
	e[ecnt].v=v;
	e[ecnt].w=w;
}
int d[N*N],vis[N*N];
queue<int> q;
int n,p,k;
void spfa()
{
	memset(d,0x3f,sizeof(d));
	d[1]=0;vis[1]=1;
	q.push(1);
	while(q.size())
	{
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(int i=head[u];i;i=e[i].Next)
		{
			int to=e[i].v;
			int w=e[i].w;
			if(d[to]>max(d[u],w))
			{
				d[to]=max(d[u],w);
				if(!vis[to])
				{
					q.push(to);
					vis[to]=1;
				}
			}
		}
	}
}
int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	cin>>n>>p>>k;
	for(int i=1;i<=p;++i)
	{
		int x,y,z;
		scanf("%d %d %d",&x,&y,&z);
		for(int j=0;j<=k;++j)
		{
			add(x+j*n,y+j*n,z);
			add(y+j*n,x+j*n,z);
		}
		for(int j=0;j<k;++j)
		{
			add(x+j*n,y+(j+1)*n,0);
			add(y+j*n,x+(j+1)*n,0);
		}
	}
	spfa();
	if(d[(k+1)*n]==INF) cout<<-1;
	else cout<<d[(k+1)*n];
	return 0;
}

2020/5/5 11:25
加载中...