求调站外题
  • 板块学术版
  • 楼主txyakioi114514
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/3/11 17:05
  • 上次更新2023/10/23 21:53:54
查看原帖
求调站外题
954103
txyakioi114514楼主2023/3/11 17:05

有没有大佬帮忙看看,实在是找不出错了,谢谢!

船上的电力系统为一股导线。对于每根导线,它是合法的当且仅当它的正极在负极的上方,并且它连接的两个端点的距离必须刚好等于这根导线的长度(完全紧绷)。原来这股导线是竖直地嵌在墙壁里的,而现在这坨导线散落在地上。他想知道导线的各个节点原来的顺序

第一行一个整数表示导线个数 n。

以下是 n 行,每行三个整数 a,b,c 表示 a(正极)必须比 b(负极)高 c。保证点数<=n+1。

输出文件包含了导线从高到低的节点序号。具有相同高度的导线节点输出在同一行里,按标号升序输出。

输入数据

9

1 2 3

2 3 5

2 7 1

4 5 4

5 6 1

5 9 1

6 7 1

7 8 3

9 8 4

输出数据 4

1

5

2 6 9

7

8

3

Limitation

40%的数据,1<=N<=200。

100%的数据,1<=N<=300。

code:

#include <bits/stdc++.h>
using namespace std;
vector <int> q[500];
int sum[500];
bool p[500];
queue<int> qq;
int mp[500][500];
int n,x,y,z;
struct info
{
	int id,sum;
}a[500];
bool cmp(info x,info y)
{
	return x.sum>y.sum||(x.sum==y.sum&&x.id<y.id);
}
void bfs()
{
	while(!qq.empty())
	{
		int to=qq.front();
		qq.pop();
		p[to]=1;
		for(int i=0;i<q[to].size();i++)
		{
			if(!p[q[to][i]])
			{
				sum[q[to][i]]=sum[to]+mp[to][q[to][i]];
				p[q[to][i]]=1;
				qq.push(q[to][i]);
			}
		}
	}
}
void print()
{
	for(int i=1;i<=n;i++)
		a[i].id=i,a[i].sum=sum[i];
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++)
	{
		cout<<a[i].id<<" ";
		if(a[i].sum>a[i+1].sum) cout<<endl;
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>x>>y>>z;
		mp[x][y]=-z;
		mp[y][x]=z;
		q[x].push_back(y);
		q[y].push_back(x);
	}
	qq.push(1);
	sum[1]=0;
	bfs();
	print();
	return 0;
}
2023/3/11 17:05
加载中...