Cod sursa(job #2695193)

Utilizator andreea.vasilescuAndreea Vasilescu andreea.vasilescu Data 12 ianuarie 2021 01:00:34
Problema PScNv Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.41 kb
#include<cstdio>
#include<vector>
#include<deque>
int n,m,x,y,max,min,dk[250001],nr[1001];
char s[100],*p,viz[250001];
std::deque<int> l[1001];
typedef struct nod
{
    int x,c;
    nod *u;
}nod;
nod*a[250001],*u[250001],*t;
inline void read1()
{
    gets(s);
    p=s;
    while(*p==' ') p++;
    n=0;
    while(*p>='0' && *p<='9') {
        n=n*10+*p-'0';
        p++;}
    while(*p==' ') p++;
    m=0;
    while(*p>='0' && *p<='9') {
        m=m*10+*p-'0';
        p++;}
    while(*p==' ') p++;
    x=0;
    while(*p>='0' && *p<='9') {
        x=x*10+*p-'0';
        p++;}
    while(*p==' ') p++;
    y=0;
    while(*p>='0' && *p<='9') {
        y=y*10+*p-'0';
        p++;}
}
inline void read()
{
    int x,y,c;
    gets(s);
    p=s;
    while(*p==' ') p++;
    x=0;
    while(*p>='0' && *p<='9'){
        x=x*10+*p-'0';
        p++;}
    while(*p==' ') p++;
    y=0;
    while(*p>='0' && *p<='9'){
        y=y*10+*p-'0';
        p++;}
    while(*p==' ') p++;
    c=0;
    while(*p>='0' && *p<='9'){
        c=c*10+*p-'0';
        p++;}
    if(x!=y){
        if(!u[x]){
            a[x]=new nod;
            u[x]=a[x];}
        else{
            t=new nod;
            u[x]->u=t;
            u[x]=t;}
        u[x]->u=0;
        u[x]->x=y;
        u[x]->c=c;
        if(c>max)  max=c;
        if(c<min)  min=c;}
}
int M(int a,int b)
{
    if(a<b) return b;
    return a;
}
int dijkstra(int min,int max)
{
    if(x==y) return 0;
    int i,j,k;
    for(i=1;i<=n;i++)
        dk[i]=max;
    dk[x]=min;
    l[min].push_back(x);
    nod *p;
    while(1)
    {
        j=min;
        do{
            for(;j<max;j++)
                if(l[j].size()>nr[j]) break;

            if(j==max) break;

            while(l[j].size()>nr[j] && viz[l[j][nr[j]]])
                nr[j]++;

        }while(l[j].size()==nr[j]);

        if(j>=dk[y]) break;
        i=l[j][nr[j]];
        min=j;
        nr[j]++;
        if(i==y) break;
        viz[i]=1;
        for(p=a[i];p;p=p->u)
            if(!viz[p->x]){
                k=M(dk[i],p->c);
                if(k<dk[p->x]){
                    dk[p->x]=k;
                    l[k].push_back(p->x);}
            }
    }
    return dk[y];

}

int main()
{
    freopen("pscnv.in","r",stdin);
    freopen("pscnv.out","w",stdout);
    read1();
    max=0;min=1001;
    int i;
    for(i=1;i<=m;i++)
        read();
    if(max==min) printf("%d\n",min);
    else
        printf("%d\n",dijkstra(min,max));
    fclose(stdout);
    return 0;
}