求助
  • 板块学术版
  • 楼主liangbob
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/8/10 22:20
  • 上次更新2023/11/3 04:35:51
查看原帖
求助
430133
liangbob楼主2023/8/10 22:20

rt。

题目大意:给定一个带权无向图(输入方式:每行3个整数u,v,w)。

现有 kk 个数,设每个数为 tt。

  • 求与 tt 相连的所有边中的权值最小的边所连顶点。若权值相同,求出编号最小的那个。

  • 求与 tt 相连的顶点,以空格间隔,其对应边的输入顺序靠后的先输出。

  • 上述两者以空格间隔

  • 输出一个数的答案后换行继续给出下一个数的答案。

数据范围:5≤n,m≤1055 \le n,m \le 10^5,1≤k,u,v≤n1 \le k,u,v \le n,1≤w≤1031 \le w \le 10^3。

我的思路:

  • 链式前向星建图

  • 依照题意输出

结果时间超限+答案错误。

代码:

#include <iostream>
#include <iomanip>
#include <cmath>
#include <string>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define endl '\n'
#define IL inline
using namespace std;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
 
IL int read()
{
    int x = 0,f = 1;
    char c = getchar();
    while(c <'0'|| c >'9'){if(c == '-') f = -1;c = getchar();}
    while(c >= '0' && c <= '9') x = x * 10 + c - '0',c = getchar();
    return x * f;
}
 
void write(int x)
{
    if(x < 0) putchar('-'),x = -x;
    if(x > 9) write(x / 10);
    putchar(x % 10 + '0');
}
 
int head[N], cnt;
 
struct node
{
    int v, w, nxt;
};
 
node e[N];
 
void add(int u, int v, int w)
{
    e[++cnt].v = v;
    e[cnt].w = w;
    e[cnt].nxt = head[u];
    head[u] = cnt;
}
 
bool vis[N];
 
int main()
{
    int n = read(), m = read(), k = read();
    memset(head, -1, sizeof(head));
    for(int i = 1;i <= m;i++)
    {
        int u = read(), v = read(), w = read();
        add(u, v, w);
        add(v, u, w);
    }
    for(int i = 1;i <= k;i++)
    {
        int s = read();
        int minv = 1e9, ans = 1e9;
	    for(int i = head[s];i != -1;i = e[i].nxt)
	    {
	        if(minv > e[i].w)
	        {
	            minv = e[i].w;
	        }
	    }
	    for(int i = head[s];i != -1;i = e[i].nxt)
	    {
	        if(minv == e[i].w)
	        {
	            ans = min(ans, e[i].v);
	        }
	    }
	    if(ans == 1e9)
	    {
	        putchar('0');
	        putchar('\n');
	        continue;
	    }
	    write(ans);
	    putchar(' ');
	    for(int i = head[s];i != -1;i = e[i].nxt)
	    {
	        if(!vis[e[i].v])
	        {
	            write(e[i].v);
	            putchar(' ');
	            vis[e[i].v] = 1;
	        }
	    }
	    putchar('\n');
	    for(int i = head[s];i != -1;i = e[i].nxt)
	    {
	        vis[e[i].v] = 0;
	    }
    }
    return 0;
}

求助!

2023/8/10 22:20
加载中...