hihoCoder1179 永恒游戏 (图游戏暴力)

题目链接:传送门

题意:

一个无向图,每个图有n个节点,m条边,每个点的权值为a[i].

如果这个点的权值大于他的度数,,那么与他相连的点的权值都

可以加1,该点的权值减去他的度数。问这个游戏能否进行100000轮。

分析:

对于一个固定的初始局面,不论怎么操作,要么可以无限操作下去,

要么在相同步数后停在相同的局面上。因此可以直接暴力模拟下。

代码如下:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 210;const int borden = 100000;int a[maxn];int du[maxn];int n,m;struct nod{int to;int next;}edge[maxn*maxn];int head[maxn],cnt;void init(){memset(a,0,sizeof(a));memset(head,-1,sizeof(head));cnt = 0;}void add(int u,int v){edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;}void solve(int u){for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;a[u]–;a[v]++;//cout<<u<<" "<<v<<endl;}}int main(){while(~scanf("%d%d",&n,&m)){init();for(int i=0;i<n;i++) scanf("%d",a+i);for(int i=0;i<m;i++){int u,v;scanf("%d%d",&u,&v);add(u,v);add(v,u);du[u]++;du[v]++;}int ans = 0;for(int i=0;i<=borden;i++){bool tag = 0;for(int j=0;j<n;j++){if(a[j]>=du[j]){solve(j);tag = 1;break;}}if(tag) ans++;else break;}if(ans>borden) puts("INF");else printf("%d\n",ans);}return 0;}

便是不再存在着任何我曾经对你有过的希望。

hihoCoder1179 永恒游戏 (图游戏暴力)

相关文章:

你感兴趣的文章:

标签云: