两种等价写法,一个60,一个100
查看原帖
两种等价写法,一个60,一个100
106248
可爱的Flandre酱楼主2020/7/7 17:13

rt,我两种等价写法唯一的区别在于拓扑排序入队列的方式,却拿了不同的分数。如果有一样WA在#2,#3的小伙伴,可以参考一下。

  • 60分:认为初始输入 c[i]=1c[i]=1 的是起点,直接推到队列里;

  • 100分:记录入度,认为入度为 00 的是起点,推到队列里。

两份代码:

#include <bits/stdc++.h>
using namespace std;
typedef int Flandre_Scarlet;
#define IsMyWife main
#define F(i,l,r) for(int i=l;i<=r;++i)
#define D(i,r,l) for(int i=r;i>=l;--i)
#define MEM(x,a) memset(x,a,sizeof(x))
#define FK(x) MEM(x,0)
#define Tra(i,u) for(int i=G.Start(u),v=G.To(i);~i;i=G.Next(i),v=G.To(i))
#define N 1333
int I() {char c=getchar(); int x=0; int f=1; while(c<'0' or c>'9') f=(c=='-')?-1:1,c=getchar(); while(c>='0' and c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return (x=(f==1)?x:-x);}
void Rd(int cnt,...) {va_list args;va_start(args,cnt); F(i,1,cnt) {int* x=va_arg(args,int*);(*x)=I();} va_end(args);}
void RA(int *a,int n) {int *p=(a+1); F(i,1,n) {(*p)=I();++p;}}
class Graph
{
    public:
        int head[N];
        int ECnt;
        struct Edge{int To,Label,Next;} Ed[N<<1];

        void clear(int _V=N,int _E=N<<1) {memset(Ed,-1,sizeof(Edge)*(_E));memset(head,-1,sizeof(int)*(_V));ECnt=-1;}
        void AddEdge(int u,int v,int w=1) {Ed[++ECnt]=(Edge){v,w,head[u]}; head[u]=ECnt;}
        void Add2(int u,int v,int w=1) {AddEdge(u,v,w);AddEdge(v,u,w);}
        int Start(int u) {return head[u];}
        int To(int u){return Ed[u].To;} int Label(int u){return Ed[u].Label;} int Next(int u){return Ed[u].Next;}
}G;
int n,m;
int c[N];
int ideg[N],odeg[N]; queue<int> Q;
void TopoSort()
{
    while(!Q.empty())
    {
        int u=Q.front(); Q.pop();
        Tra(i,u) 
        {
            if (c[u]>0) c[v]+=c[u]*G.Label(i);
            --ideg[v];  if (!ideg[v]) Q.push(v);
        }
    }
}
Flandre_Scarlet IsMyWife()
{
    Rd(2,&n,&m);
    F(i,1,n) 
    {
        c[i]=I(); int u=I(); 
        if (c[i]==0) c[i]-=u;
        else Q.push(c[i]);
    }
    G.clear();
    F(i,1,m) {int u=I(),v=I(),w=I(); G.AddEdge(u,v,w); ++ideg[v],++odeg[u];}
    TopoSort();
    bool find=0;
    F(i,1,n) if (c[i]>0 and !odeg[i])
    {
        printf("%d %d\n",i,c[i]); find=1;
    }
    if (!find) puts("NULL");
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef int Flandre_Scarlet;
#define IsMyWife main
#define F(i,l,r) for(int i=l;i<=r;++i)
#define D(i,r,l) for(int i=r;i>=l;--i)
#define MEM(x,a) memset(x,a,sizeof(x))
#define FK(x) MEM(x,0)
#define Tra(i,u) for(int i=G.Start(u),v=G.To(i);~i;i=G.Next(i),v=G.To(i))
#define N 1333
int I() {char c=getchar(); int x=0; int f=1; while(c<'0' or c>'9') f=(c=='-')?-1:1,c=getchar(); while(c>='0' and c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return (x=(f==1)?x:-x);}
void Rd(int cnt,...) {va_list args;va_start(args,cnt); F(i,1,cnt) {int* x=va_arg(args,int*);(*x)=I();} va_end(args);}
void RA(int *a,int n) {int *p=(a+1); F(i,1,n) {(*p)=I();++p;}}
class Graph
{
    public:
        int head[N];
        int ECnt;
        struct Edge{int To,Label,Next;} Ed[N<<1];

        void clear(int _V=N,int _E=N<<1) {memset(Ed,-1,sizeof(Edge)*(_E));memset(head,-1,sizeof(int)*(_V));ECnt=-1;}
        void AddEdge(int u,int v,int w=1) {Ed[++ECnt]=(Edge){v,w,head[u]}; head[u]=ECnt;}
        void Add2(int u,int v,int w=1) {AddEdge(u,v,w);AddEdge(v,u,w);}
        int Start(int u) {return head[u];}
        int To(int u){return Ed[u].To;} int Label(int u){return Ed[u].Label;} int Next(int u){return Ed[u].Next;}
}G;
int n,m;
int c[N];
int ideg[N],odeg[N]; queue<int> Q;
void TopoSort()
{
    F(i,1,n) if (!ideg[i]) Q.push(i);
    while(!Q.empty())
    {
        int u=Q.front(); Q.pop();
        Tra(i,u) 
        {
            if (c[u]>0) c[v]+=c[u]*G.Label(i);
            --ideg[v];  if (!ideg[v]) Q.push(v);
        }
    }
}
Flandre_Scarlet IsMyWife()
{
    Rd(2,&n,&m);
    F(i,1,n) 
    {
        c[i]=I(); int u=I(); 
        if (c[i]==0) c[i]-=u;
    }
    G.clear();
    F(i,1,m) {int u=I(),v=I(),w=I(); G.AddEdge(u,v,w); ++ideg[v],++odeg[u];}
    TopoSort();
    bool find=0;
    F(i,1,n) if (c[i]>0 and !odeg[i])
    {
        printf("%d %d\n",i,c[i]); find=1;
    }
    if (!find) puts("NULL");
    return 0;
}

(PS:这个 LightningUZ 是我大号)

2020/7/7 17:13
加载中...