社区讨论

调了一晚上了,人要紫砂了

P1993小 K 的农场参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lo7r76lg
此快照首次捕获于
2023/10/27 06:26
2 年前
此快照最后确认于
2023/10/27 06:26
2 年前
查看原帖
CPP
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define in int /*long long*/
#define ri register int /*long long*/
#define maxn 500005
using namespace std;
in n,m;
inline in read()
{
    in x=0,ff=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
        ff=-1;
        ch=getchar();
    }
    while (ch>='0'&&ch<='9')
    {
        x=(x<<3)+(x<<1)+ch-'0';
        ch=getchar();
    }
    return x*ff;
}
inline void write(in x)
{
    if(x<0)
    {
        putchar('-');
        x=-x;
    }
    if(x>9) 
    write(x/10);
    putchar(x%10+'0');
}
inline void write_space(in x)
{
    write(x);putchar(32);
}
inline void write_line(in x)
{
    write(x);putchar(10);
}
in cnt,head[maxn];
struct node{
    in next,to,w;
}edge[maxn << 1];
void add(in u,in v,in w){
    edge[++cnt].to = v;
    edge[cnt].w = w;
    edge[cnt].next = head[u];
    head[u] = cnt;
}
void spfa(in u){
    in dist[maxn],cnt_push[maxn];
    bool vis[maxn],flag = 1;
    memset(vis,0,sizeof(vis));
    memset(dist,-0x3f,sizeof(dist));
    memset(cnt_push,0,sizeof(cnt_push));
    queue <in> q;
    dist[u] = 0;
    q.push(u);
    vis[u] = true;
    cnt_push[u] ++;
    while(!q.empty()) {
        in f = q.front();
        // cout << f << ' ' << dist[f] << endl;
        q.pop();
        vis[f] = false;
        for(in i = head[f] ; i ; i = edge[i].next){
            in v = edge[i].to;
            if(dist[v] < dist[f] + edge[i].w){
                dist[v] = dist[f] + edge[i].w;
                if(!vis[v]){
                    vis[v] = true;
                    cnt_push[v] ++;
                    if(cnt_push[v] > n + 1){
                        flag = 0;
                        break;
                    }
                    q.push(v);
                }
            }

        }
        if(!flag){
            cout << "No";
            return ;
        }
    }
    cout << "Yes";
    // for(int i = 1 ; i <= n ; i ++){
    //     cout << dist[i] << ' ';
    // }
}
int main()
{
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    n = read(),m = read();
    for(int i = 1 ; i <= n ; i ++)
        add(0,i,0);
    for(int i = 1 ; i <= m ; i ++){
        in f = read();
        in x = read(),y = read();
        if(f == 1) add(x,y,-read());
        else if(f == 2) add(y,x,read());
        else add(x,y,0),add(y,x,0);
    }

    spfa(0);
    //fclose(stdin);
    //fclose(stdout);
    system("pause");
    return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...