求助wa4
查看原帖
求助wa4
151647
sycqwq楼主2022/2/21 19:47
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=3e5+5;
int n,m,k,dis[maxn];
struct edge
{
    int u,v,w,nxt;
}e[maxn<<1];
int head[maxn],tot;
void add(int x,int y,int w)
{
    e[++tot].u=x;
    e[tot].v=y;
    e[tot].nxt=head[x];
    e[tot].w=w;
    head[x]=tot;
}
struct node
{
    int x,di;
    int operator<(node s1)const
    {
        return di>s1.di;
    }
};
int pre[maxn],bk[maxn];
void dij()
{
    priority_queue<node> q;
    q.push((node){1,0});
    memset(dis,0x7f,sizeof dis);
    dis[1]=0;
    while(!q.empty())
    {
        node x=q.top();
        q.pop();
        if(bk[x.x])
            continue;
        bk[x.x]=1;
        for(int i=head[x.x];i;i=e[i].nxt)
        {   
            int v=e[i].v;
            if(dis[v]>x.di+e[i].w)
            {
                dis[v]=x.di+e[i].w;
                q.push((node){v,dis[v]});
                pre[v]=i;
            }
            else if(dis[v]==x.di+e[i].w&&e[i].w<e[pre[v]].w)
                pre[v]=i;
        }
    }
} 
vector<pair<int,int> > g[maxn];
int d[maxn],qwq;
void top()
{
    queue<int> q;
    int t=0; 
    for(int i=1;i<=n;i++)
    {
        if(!d[i])
            q.push(i);
    } 
    while(!q.empty())
    {
        int x=q.front();
        ++t; 
        for(int i=0;i<g[x].size();i++)
        {
            int v=g[x][i].first;
            bk[g[x][i].second]=0;
            --d[v];
            if(!d[v])
                q.push(v);
        }
        if(n-1-t==k)
        {
            qwq=t;
            break;
        }
    }
}
signed main()
{
    cin>>n>>m>>k;
    for(int i=1;i<=m;i++)
    {
        int x,y,w;
        cin>>x>>y>>w;
        add(x,y,w);
        add(y,x,w);
    }
    dij();
    memset(bk,0,sizeof bk);
    for(int i=2;i<=n;i++)
    {
        bk[pre[i]]=1;   
        g[i].push_back(make_pair(e[pre[i]].u,pre[i]));
        ++d[e[pre[i]].u];
    }
    if(k>=n-1)
    {
        cout<<n-1<<endl;
        for(int i=1;i<=tot;i++)
            if(bk[i])
                cout<<(i+1>>1)<<' ';
        return 0;
    }
    top();
    int t=0;
    cout<<k<<endl;
    for(int i=1;i<=tot;i++)
        if(bk[i])
        {
            cout<<(i+1>>1)<<' ';
            ++t;
        }
    // if(t!=k)
    // {
    //     cout<<"###"<<t<<' '<<qwq<<endl;
    //     for(int i=2;i<=n;i++)
    //         cout<<pre[i]<<endl;
    //     puts("!!!");
    // }
    return 0;
}

大概是输出多了

2022/2/21 19:47
加载中...