题目要求输出边的序号,比赛的时候一直忘记记录序号了……所以一直WA………………
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
struct edge
{
int v,u;
LL w;
int num;
};
int cnt=0;
edge e[100005];
int add(int u,int v,LL w)
{
e[cnt].u=u;
e[cnt].w=w;
e[cnt].v=v;
e[cnt].num=cnt+1;
cnt++;
}
int p[50005];
int find(int x)
{
return p[x]==x?x:p[x]=find(p[x]);
}
bool cmp(edge a,edge b)
{
return a.w>b.w;
}
int m,n;
LL s;
int in[100005];
int Ans[100005];
int Kruskal()
{
memset(in,0,sizeof(in));
int i;
for(i=0;i<=n;i++) p[i]=i;
sort(e,e+cnt,cmp);
for(i=0;i<m;i++)
{
int x=find(e[i].u),y=find(e[i].v);
if(x!=y)
{
in[i]=1;
p[x]=y;
}
}
LL t=0;
int ans=0;Oil Deal
for(i=m-1;i>=0;i--)
{
if(in[i])continue;
t+=e[i].w;
if(t>s)break;
Ans[ans++]=e[i].num;
}
return ans;
}
int main()
{
int f=0;
while(~scanf("%d%d%lld",&n,&m,&s))
{
cnt=0;
if(f)puts("");
f=1;
int i,v,u;
LL w;
for(i=0;i<m;i++)
{
scanf("%d%d%lld",&v,&u,&w);
add(v,u,w);
}
int ans=Kruskal();
printf("%d\n",ans);
for(i=0;i<ans;i++)
{
printf("%d",Ans[i]);
if(i!=ans-1)
printf(" ");
}
if(ans)puts("");
}
return 0;
}