You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.6 KiB
C++
61 lines
1.6 KiB
C++
#include <cstdio>
|
|
#include <cstring>
|
|
#include <utility>
|
|
#include <algorithm>
|
|
using namespace std;
|
|
const int N = 3e5 + 10, M = N << 1;
|
|
int adj[N], ecnt = 1, dis[N];
|
|
struct
|
|
{
|
|
int from, to, len, next, val;
|
|
} E[M];
|
|
inline void addEdge(int f, int t, int l)
|
|
{
|
|
ecnt++;
|
|
E[ecnt].next = adj[f];
|
|
E[ecnt].from = f;
|
|
E[ecnt].len = l;
|
|
E[ecnt].to = t;
|
|
adj[f] = ecnt;
|
|
}
|
|
void spfa(int S)
|
|
{
|
|
static int q[N << 2];
|
|
static bool inq[N];
|
|
memset(inq, 0, sizeof(inq));
|
|
int h = 0, t = 0;
|
|
for (inq[q[t++] = S] = true; h ^ t; inq[h++] = false)
|
|
for (int e = adj[q[h]]; e; e = E[e].next)
|
|
if (dis[E[e].to] > dis[q[h]] + E[e].len)
|
|
{
|
|
dis[E[e].to] = dis[q[h]] + E[e].len;
|
|
if (!inq[E[e].to]) inq[q[t++] = E[e].to] = true;
|
|
}
|
|
}
|
|
pair<int, int> P[N];
|
|
bool flg[N];
|
|
int main()
|
|
{
|
|
int n, m, k;
|
|
scanf("%d%d%d", &n, &m, &k);
|
|
for (int i = 0, x, y, w; i < m; i++)
|
|
{
|
|
scanf("%d%d%d", &x, &y, &w);
|
|
addEdge(x, y, w);
|
|
addEdge(y, x, w);
|
|
}
|
|
spfa(1);
|
|
for (int i = 1; i <= ecnt; i++)
|
|
if (dis[E[i].from] == dis[E[i].to] + E[i].len)
|
|
E[i].val++;
|
|
for (int i = 2; i <= ecnt; i += 2)
|
|
P[i >> 1].first = max(E[i].val, E[i + 1].val), P[i >> 1].second = (i >> 1);
|
|
sort(P + 1, P + (ecnt >> 1) + 1);
|
|
printf("%d\n", k);
|
|
for (int i = 1; i <= m - k; i++)
|
|
flg[P[i].second] = true;
|
|
for (int i = 1; i <= m; i++)
|
|
if (!flg[i])
|
|
printf("%d ", i);
|
|
return 0;
|
|
} |