【HAOI2015】PG图

Description

背景

LDN不知道为什么特别喜欢PG,也许是某种原因吧……

有一天,他发明了一个游戏“PG图”。

问题描述

给定一个有向图,每条边都有一个权值。

每次你可以选择一个节点u和一个整数d,把所有以u为终点的边的权值减小d,把所有以u为起点的边的权值加上d。最后要让所有边的权值的最小值为正且尽量大。

Input

输入包含若干组数据。

每组数据第一行为两个整数n和m(n<=500,m<=2700),表示点和边的个数。

以下m行,每行包括3个整数u,v,w,表示u -> v有一条边权为w的边。(1<= u,v<= n, -10000<= w<= 10000)

Output

对于每组数据,输出边权最小值的最大值;

如果无法让所有边权都大于0,输出“No Solution”;

如果边权最小值可以无限大,输出“Infinite”。

Sample Input

2 1

1 2 10

2 1

1 2 -10

3 3

1 2 4

2 3 2

3 1 5

4 5

2 3 4

4 2 5

3 4 2

3 1 0

1 2 -1

Sample Output

Infinite

Infinite

3

1

Hint

数据范围与约定

对于30%的数据:2<= n<= 10,1<= m<= 100

对于60%的数据:2<= n<= 100,1<= m<=1000

对于100%的数据:2<= n<= 500,1<= m<=2700

Source

图论 , 差分约束

p { margin-bottom: 0.25cm; line-height: 120% }

思路{

  这种看起来无从下手的东东就往查分约束上想想。。。。

  设sum[x]为改变x的出度的∑d。

  设答案为mid,有dis(i,j)+sum[a]-sum[b]>=mid;

  变形 sum[b]-sum[a]<=dis(i,j)-mid;

  插分约束加二分答案。枚举每一个点,求最短路因为要全部满足要求

  但是,叶闻捷大神的dfs找环真是妙不可言啊!!!!!!

  比我的傻逼SPFA快了10多倍!!!!

  (OrzOrzOrzOrz)

}

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<queue>
 7 #include<ctime>
 8 #include<cmath>
 9 #include<list>
10 #include<deque>
11 #include<stack>
12 #include<map>
13 #include<set>
14 #define RG register
15 #define LL long long
16 #define dd double
17 #define maxx 501
18 #define mid ((l+r)>>1)
19 #define make(x) vis[x]=true;
20 #define made(x) vis[x]=false;
21 using namespace std;
22 struct ed{
23 int nxt,to,c;
24 }e[2770];bool vis[maxx];
25 int head[maxx],tot,n,m,dis[maxx],cnt[maxx];
26 void add(int u,int v,int c){e[tot].nxt=head[u];e[tot].c=c;e[tot].to=v;head[u]=tot++;}
27 bool SPFA(int s,int num){
28   make(s)
29     for(int i=head[s];i!=-1;i=e[i].nxt)if(dis[e[i].to]>dis[s]+e[i].c-num){
30         if(vis[e[i].to])return 1;
31         dis[e[i].to]=dis[s]+e[i].c-num;
32         if(SPFA(e[i].to,num))return 1;
33       }return made(s);
34 }
35 int main(){
36   while(scanf("%d%d",&n,&m)!=EOF){
37     memset(head,-1,sizeof(head));tot=0;
38     for(int i=1;i<=m;++i){
39       int u,v,w;
40       scanf("%d%d%d",&u,&v,&w);
41       add(u,v,w);
42     }
43     int l=1,r=100000;
44     while(l<=r){
45       bool flag=true;
46       for(int i=1;i<=n;++i){
47         memset(vis,false,sizeof(vis));
48         memset(dis,127,sizeof(dis));
49         if(SPFA(i,mid)){flag=false;break;}
50       }
51       if(!flag)r=mid-1;else l=mid+1;
52     }if(r>10000)cout<<"Infinite\n";
53     else if(!r)cout<<"No Solution\n";
54     else cout<<r<<‘\n‘;
55   }
56   return 0;
57 }
时间: 2024-10-08 22:24:53

【HAOI2015】PG图的相关文章

CJOJ1857 -PG图

Description 背景 LDN不知道为什么特别喜欢PG,也许是某种原因吧-- 有一天,他发明了一个游戏"PG图". 问题描述 给定一个有向图,每条边都有一个权值. 每次你可以选择一个节点u和一个整数d,把所有以u为终点的边的权值减小d,把所有以u为起点的边的权值加上d.最后要让所有边的权值的最小值为正且尽量大. ***首先吐槽一下这哪是HAOI2015的题目... 经过人类智慧可得之,这题关键在环.只要有环,这个环上边的总和是不变的,而其它地方是随便变的. so,二分答案,所有边

HAOI2015PG图

P1857 - [HAOI2015]PG图 Description 背景 LDN不知道为什么特别喜欢PG,也许是某种原因吧-- 有一天,他发明了一个游戏"PG图". 问题描述 给定一个有向图,每条边都有一个权值. 每次你可以选择一个节点u和一个整数d,把所有以u为终点的边的权值减小d,把所有以u为起点的边的权值加上d.最后要让所有边的权值的最小值为正且尽量大. Input 输入包含若干组数据. 每组数据第一行为两个整数n和m(n<=500,m<=2700),表示点和边的个数

5.6水题合集

T1:杭州旅行 floyd 求最小环,相当于枚举环上编号最大的点进行转移 正确性: 一个环中的最大结点为k(编号最大),与他相连的两个点为i,j,这个环的最短长度为g[i][k]+g[k][j]+i到j的路径中,所有结点编号都小于k的最短路径长度根据floyd的原理,在最外层循环做了k-1次之后,dist[i][j]则代表了i到j的路径中,所有结点编号都小于k的最短路径综上所述,该算法一定能找到图中最小环 #include<iostream> #include<cstdio> #i

08-图8 How Long Does It Take

Given the relations of all the activities of a project, you are supposed to find the earliest completion time of the project. Input Specification: Each input file contains one test case. Each case starts with a line containing two positive integers N

俑烟汲的诿樟透磺勒秤窗mvus

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

利用filter实时切换big5和gb2312,以及gb2312的简繁体

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

05-2. Saving James Bond - Easy Version (PAT) - 图的遍历问题

This time let us consider the situation in the movie "Live and Let Die" in which James Bond, the world's most famous spy, was captured by a group of drug dealers. He was sent to a small piece of land at the center of a lake filled with crocodile

poj1149 PIGS 最大流(神奇的建图)

一开始不看题解,建图出错了.后来发现是题目理解错了.  if Mirko wants, he can redistribute the remaining pigs across the unlocked pig-houses. 题目中的这句话非常关键,没理解就错掉了.有很多人写的题解只告诉我们怎么做,却没告诉我们为什么要那样做. 这句话是的意思是可以重组打开过的猪圈.也就是当客人打开猪圈(他能打开的都打开了)以后,他选择了需要买的猪以后,Mirko可以随意把剩下的猪分配到打开的猪圈中.当然,我

05-1. List Components (PAT) - 图的遍历问题

For a given undirected graph with N vertices and E edges, please list all the connected components by both DFS and BFS. Assume that all the vertices are numbered from 0 to N-1. While searching, assume that we always start from the vertex with the sma