zoukankan      html  css  js  c++  java
  • 题解:[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 }
  • 相关阅读:
    (转) qt: usb热插拔(linux);
    Qt: usb热插拔检测(windows);
    C++: 模板函数定义与声明分离;
    bootstrap: 内联表单;
    thinkphp5: 循环输出表格,并固定表格单元宽度(过长省略号)
    响应式菜单栏: bootstrap + jQuery
    Qt: 数据库操作;
    qt: 获取sql数据表的所有的字段;
    Qt: 非阻塞时间延迟;
    egg中使用jwt
  • 原文地址:https://www.cnblogs.com/Aze-qwq/p/9889267.html
Copyright © 2011-2022 走看看