考虑到每条边最多只能使一个点进入最短路图,所以答案就是构建一棵不超过k条边的最短路树
注意不要搞出森林
#include<bits/stdc++.h>
using namespace std;
#define N 300005
typedef long long ll;
int Q[N],tot,s[N],ans;
bool vis[N],op[N];
ll dis[N];
struct edge{int v,c,n,num;}e[N<<1];
#define Push(u,v,c,n) push(u,v,c,n),push(v,u,c,n)
inline void push(int u,int v,int c,int num){e[++tot]=(edge){v,c,s[u],num};s[u]=tot;}
inline void bfs()
{
deque<int> Q;
memset(dis,0x3f,sizeof(dis));
Q.push_back(1);
dis[1]=0;
#define V e[i].v
while (!Q.empty())
{
int h=Q.front();Q.pop_front();
vis[h]=0;
for (int i=s[h];i;i=e[i].n) if (dis[V]>dis[h]+e[i].c)
{
dis[V]=dis[h]+e[i].c;
if (!vis[V])
{
vis[V]=1;
if (Q.empty()||dis[V]<=dis[Q.front()]) Q.push_front(V);
else Q.push_back(V);
}
}
}
}
int main()
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for (int u,v,c,i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&c);
Push(u,v,c,i);
}
bfs();
vis[1]=1;
Q[1]=1;
#define V e[i].v
for (int l=1,r=1;l<=r;l++) for (int i=s[Q[l]];i && ans<k;i=e[i].n) if (dis[V]==dis[Q[l]]+e[i].c && !vis[V])
{
vis[Q[++r]=V]=1;
op[e[i].num]=1;
ans++;
}
printf("%d\n",ans);
for (int i=1;ans;i++) if (op[e[i].num])
{
printf("%d%c",e[i].num,--ans?' ':'\n');
op[e[i].num]=0;
}
}