萌新求助大佬,#29wa,其他ac了
查看原帖
萌新求助大佬,#29wa,其他ac了
307777
juuichi楼主2021/9/22 18:35
#include<bits/stdc++.h>
//typedef long long ll;
// #define int long long
#define mst(a,b) memset(a,b,sizeof(a))
#define rd read()
#define rd1 read1()
#define pos(i,a,b) for(int i=(a);i<=(b);i++)
#define neg(i,a,b) for(int i=(a);i>=(b);i--)
#define mp make_pair
#define ls (p<<1)
#define rs (p<<1|1)
#define zycisyourfather
using namespace std;

typedef pair<int,int> pii;

const int Max=4e3+10;
const int inf=0x3f3f3f;
const int M=1e9+7;
const int N=3;
const double eps=1e-7;
const double Pi=3.1415926535897;

inline int read()
{
    int x=0,k=1; char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')k=-1;c=getchar();}
    while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*k;
}
int n,m;
int head[Max],cnt;
int x[Max],y[Max],ans[Max];
bool vs[Max],vs1[Max],flag[Max];
struct Edge
{
    int to,nxt,l;
}e[Max];
struct Edge1
{
    int to,nxt;
}E[Max];
int hed[Max],cnt1;
struct Edge2
{
    int to,nxt;
}T[Max];
int tal[Max],cnt2;
void add1(int u,int v)
{
    E[++cnt1].to=v;
    E[cnt1].nxt=hed[u];
    hed[u]=cnt1;
}
void add2(int u,int v)
{
    T[++cnt2].to=v;
    T[cnt2].nxt=tal[u];
    tal[u]=cnt2;
}
void add(int u,int v,int w)
{
    e[++cnt].to=v;
    e[cnt].nxt=head[u];
    e[cnt].l=w;
    head[u]=cnt;
}
int num[Max],dis[Max];
bool vis[Max];
queue<int> q;

bool spfa(int s)
{
    mst(dis,inf);
    mst(vis,0);
    mst(num,0);
    while(!q.empty()) q.pop();
    dis[s]=0;
    vis[s]=1;
    num[s]=1;
    q.push(s);
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        vis[x]=0;
        for(int i=head[x];i;i=e[i].nxt)
        {
            int now=e[i].to,len=e[i].l;
            if(dis[x]+len<dis[now])
            {
                dis[now]=len+dis[x];
                num[now]=num[x]+1;
                if(num[now]>n) return 1;//判断负环 
                if(!vis[now]) {vis[now]=1;q.push(now);}         
            }
        }
    }
    return 0;
}

void dfs1(int x)
{
    vs[x]=1;
    for(int i=hed[x];i;i=E[i].nxt)
    {
        int now=E[i].to;
        if(vs[now]) continue;
        dfs1(now);
    }
}

void dfs2(int x)
{

    vs1[x]=1;
    for(int i=tal[x];i;i=T[i].nxt)
    {
        int now=T[i].to;
        if(vs1[now]) continue;
        dfs2(now);
    }
}

int main()
{
    #ifdef zycisyourfather
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif 
    n=rd,m=rd;
    pos(i,1,m)
    {
        x[i]=rd,y[i]=rd;
        add1(x[i],y[i]);
        add2(y[i],x[i]);
    }
    dfs1(1);
    dfs2(n);
    if(!vs[n]) {puts("-1");return 0;}
    pos(i,1,n) 
    {
        if(vs[i]&&vs1[i]) flag[i]=1;
    }
    mst(ans,0);
    pos(i,1,m)
    {
        if(flag[x[i]]&&flag[y[i]]) 
        {
            add(x[i],y[i],9);
            add(y[i],x[i],-1);
        }
        else ans[i]=1;
    }
    //pos(i,1,n) add(0,i,0);这道题无所谓连不连通,不连通的自然不包括在1到n内,所以这部分随便赋值即可
    
    printf("%d %d\n",n,m);
    if(!spfa(1))
    {
        pos(i,1,m) 
        {
            if(ans[i]==0) 
            {
                ans[i]=dis[y[i]]-dis[x[i]];
            }
        }
        pos(i,1,m) printf("%d %d %d\n",x[i],y[i],ans[i]);
    }
    else puts("-1");
    return 0;
}
2021/9/22 18:35
加载中...