• 题解:[USACO05DEC]layout布局


    又是很明显的差分约束

    注意数组的大小问题

    然后是碰到大于等于的情况转化为小于等于的情况建图

    然后是spfa

    需要判断有没有环

    以及判断图是否连通

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<queue>
     6 using namespace std;
     7 const int m=10005;
     8 const int inf=0x3f3f3f3f;
     9 int head[m], dis[m], used[m];
    10 bool vis[m];
    11 int n, ml, md;
    12 int cnt;
    13 queue<int> q;
    14 struct Edge{
    15     int to, w, next;
    16 }e[m*4];
    17 void add(int u,int v,int w){
    18     cnt++;
    19     e[cnt].next=head[u];
    20     e[cnt].w=w;
    21     e[cnt].to=v;
    22     head[u]=cnt;
    23 }
    24 bool spfa(int s){
    25     memset(dis,0x3f,sizeof(dis));
    26     memset(vis,0,sizeof(vis));
    27     memset(used,0,sizeof(used));
    28     dis[s]=0;
    29     q.push(s);
    30     vis[s]=true;
    31     while(!q.empty()){
    32         int u=q.front();
    33         q.pop();
    34         vis[u]=false;
    35         for(int i=head[u]; i; i=e[i].next){
    36             int v=e[i].to;
    37             int w=e[i].w;
    38             if(dis[v]>dis[u]+w){
    39                 dis[v]=dis[u]+w;
    40                 used[v]++;
    41                 if(used[v]==n)
    42                     return false;
    43                 if(!vis[v]){
    44                     q.push(v);
    45                     vis[v]=true;
    46                 }
    47             }
    48         }
    49     }
    50     return true;
    51 }
    52 int main(){
    53     int a, b, d;
    54     scanf("%d%d%d",&n,&ml,&md);
    55     for(int i=1; i<=n; i++) add(0,i,0);
    56     for(int i=1; i<=ml; i++){
    57         scanf("%d%d%d",&a,&b,&d);
    58         add(a,b,d);
    59     }
    60     for(int i=1; i<=md; i++){
    61         scanf("%d%d%d",&a,&b,&d);
    62         add(b,a,-d);
    63     }
    64     bool flag1=spfa(0);
    65     bool flag2=spfa(1);
    66     if(!flag1 || !flag2) puts("-1"); 
    67     else if(dis[n]==inf) puts("-2");
    68     else printf("%d",dis[n]);
    69     return 0;
    70 }
  • 相关阅读:
    next_permutation
    P1087 FBI树
    P4047 [JSOI2010]部落划分
    买礼物
    P2121 拆地毯
    Nebula Graph 在大规模数据量级下的实践和定制化开发
    深入了解kafka系列-消费者
    一分钟教你搭建WebRTC流媒体服务器Janus-gateway
    什么是"前端工程化"?
    斗鱼Juno 监控中心的设计与实现
  • 原文地址:https://www.cnblogs.com/Aze-qwq/p/9889267.html
Copyright © 2020-2023  润新知