hihoCoder挑战赛C题——永恒游戏
题目链接:http://hihocoder.com/problemset/problem/1179
注意点
有一个定理保证,对于一个固定的初始局面,不论怎么操作,要么可以无限操作下去,要么在相同步数之后停在相同的局面上。所以只需要模拟100000次即可知道本题答案。
定理的证明可以在以下论文中找到 http://www.cs.elte.hu/~lovasz/morepapers/chips.pdf (定理1.1)
可执行代码
#include<iostream>
#include<fstream>
using namespace std;
#define INF 100000
#define Node 205
int main()
{
//ifstream cin("input.txt");
int n,m;//节点数,边数
cin>>n>>m;
int num[Node];
int degree[Node];
bool graph[Node][Node];
for(int i = 0;i<n;i++)
{
degree[i] = 0;
for(int j = 0;j<n;j++)
graph[i][j] = false;
}
for(int i = 0;i<n;i++)
cin>>num[i];
int a,b;
for(int i = 0 ;i<m;i++)
{
cin>>a>>b;
graph[a][b] = graph[b][a] = true;
degree[a]++;
degree[b]++;
}
int result = 0;
while(result<INF)
{
int i =0;
while(i<n && num[i]<degree[i])
i++;
if(i==n)
break;
else
{
result++;
num[i]-=degree[i];
for(int j =0;j<n;j++)
if(graph[i][j])
num[j]++;
}
}
if(result == INF)
cout<<"INF";
else
cout<<result;
return 0;
}