E - E CodeForces - 1100E (+ media clasificación topológica)

E - E CodeForces - 1100E

N tiene un nodos gráfico dirigido, los nodos están numerados del 1 al n, m la presencia de bordes unidireccionales. Cada borde tiene un peso de ida, en nombre del costo requerido para invertir la dirección del mismo. Figura buscan convertir en gráfico acíclico, donde los esquemas de ponderación más pequeños borde máximo de tirón, y el lado derecho de la máxima esquema de tapa.

Introducir un único conjunto de entradas, una primera línea contiene dos números enteros n y m (2≤n≤100 000,1≤m≤100 000) siguiente m líneas de tres números enteros, u_i, v_i
, w_i (. 1 <= u_i, v_i <= n- ,. 1 <= w_i <=
10 ^. 9), hay una u a v representa un peso de w a la carretera. Desde el comienzo de la carretera número 1. Sin bucle de retorno.

Salida Salida de dos números enteros en la primera línea, es decir, dar la vuelta a la derecha de la más grande, y la necesidad de revertir el número de carreteras k. k no tiene que ser mínima.

En la siguiente salida de línea k-espacio separado entero que representa el número de necesidad carretera para voltear la

Si hay muchas soluciones, imprimir cualquiera de ellos.

Examples
Input
5 6
2 1 1
5 2 6
2 3 2
3 4 3
4 5 5
1 5 4
Output
2 2
1 3 
Input
5 7
2 1 5
3 2 3
1 3 3
2 4 1
4 3 5
5 4 1
1 5 3
Output
3 3
3 4 7 

pensamiento

  • Significado del título: Dame un mapa para el valor ponderado, esta cifra puede existir anillo, mientras que la inversión de peso mínimo preguntar cuánto se necesita para cambiar el todo?
  • Ideas: primero con enumeración binario, el lado máximo hacia el lado derecho de la mitad de inversión mínimo, se les da un dibujo del borde lateral derecha del borde es menor que la mitad considera borde bidireccional (no presente), entonces el restante la figura menor de la carrera clasificación topológica lado, para ver si hay anillo, en su caso, así que l = mediados + 1, r = lo contrario mediados - 1
  • enlace

solución del problema

#include<iostream>
#include<cmath>
#include<cstdio>
#include<queue>
#include<cstring>
#define int long long
#define inf 10000000000000
using namespace std;
int read(){
    int res=0;char ch=0;
    while (!isdigit(ch))ch=getchar();
    while (isdigit(ch))res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
    return res;
}

const int N=1000100;
struct EDGE{
    int ver,nxt,dis,pre;
}edge[N];
int n,m,cnt,head[N],vis[N],d[N],ans[N],dfn[N],dfs_cnt;

void add(int u,int v,int t){
    edge[++cnt].ver=v;
    edge[cnt].nxt=head[u];
    edge[cnt].dis=t;
    edge[cnt].pre=u;
    head[u]=cnt;
}

queue<int>q;
bool check(int x){

    memset(d,0,sizeof(d));memset(vis,0,sizeof(vis));

    for (int i=1;i<=m;i++)if(edge[i].dis>x)d[edge[i].ver]++;

    for (int i=1;i<=n;i++)if (!d[i])q.push(i);

    while (!q.empty()){

        int u=q.front();q.pop();

        for (int i=head[u];i;i=edge[i].nxt)
        {
            if (edge[i].dis<=x)continue;

            int v=edge[i].ver;d[v]--;if (!d[v])q.push(v);
        }
    }

    for (int i=1;i<=n;i++)if (d[i])return 0;

    return 1;
}
void solute(int x){
    memset(d,0,sizeof(d));memset(vis,0,sizeof(vis));

    for (int i=1;i<=m;i++)if(edge[i].dis>x)d[edge[i].ver]++;
    for (int i=1;i<=n;i++)if (!d[i])q.push(i);

    while (!q.empty())
    {
        int u=q.front();q.pop();dfn[u]=++dfs_cnt;

        for (int i=head[u];i;i=edge[i].nxt)
        {
            if (edge[i].dis<=x)continue;
            int v=edge[i].ver;d[v]--;if (!d[v])q.push(v);
        }
    }

    for (int i=1;i<=m;i++){
        if (edge[i].dis<=x){
            int u=edge[i].pre,v = edge[i].ver;
            if (dfn[u]>dfn[v])ans[++cnt]=i;
        }
    }
}
signed main(){
    n=read();m=read();
    for (int i=1;i<=m;i++){
        int x=read(),y=read(),t=read();add(x,y,t);
    }
    int l=0,r=inf;
    while (l<r)
    {
        int mid=l+r>>1;
        if (check(mid))
            r=mid;
        else
            l=mid+1;
    }

    cnt=0;
    solute(r);
    printf("%lld %lld\n",r,cnt);
    for (int i=1;i<=cnt;i++){
        printf("%lld ",ans[i]);
    }
}

Supongo que te gusta

Origin www.cnblogs.com/lql-nyist/p/12629446.html
Recomendado
Clasificación