rt。
题目大意:给定一个带权无向图(输入方式:每行3个整数u,v,w)。
现有 k 个数,设每个数为 t。
求与 t 相连的所有边中的权值最小的边所连顶点。若权值相同,求出编号最小的那个。
求与 t 相连的顶点,以空格间隔,其对应边的输入顺序靠后的先输出。
上述两者以空格间隔
输出一个数的答案后换行继续给出下一个数的答案。
数据范围:5≤n,m≤105,1≤k,u,v≤n,1≤w≤103。
我的思路:
链式前向星建图
依照题意输出
结果时间超限+答案错误。
代码:
#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;
}
求助!