您的位置:首页 > 运维架构

Topcoder SRM 637 (Div.2)

2014-10-24 20:50 218 查看
A.GreaterGameDiv2

不能更水

#include<cstdio>
#include <cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<stack>
#include<string>
#include <ctime>
#include<vector>
#include<queue>
#include <cctype>
#include<sstream>
#define eps 0.000001
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define clr(x,a) memset(x,a,sizeof(x))
#define sz(x) (int)x.size()
#define pb push_back
#define mp make_pair
using namespace std;
typedef long long LL;
int n,m;
class ConnectingGameDiv2
{
int dis[260][260],sum[260],start,finish,left,right;
vector <string> grid;
public:
void addedge(int i,int j,int x, int y)
{
if (x<0||y<0||x>=n||y>=m) return;
int a=(int)grid[i][j];
int b=(int)grid[x][y];
dis[a][b]=min(dis[a][b],sum[a]);
dis[b][a]=min(dis[b][a],sum[b]);
}

int getmin(vector <string> board)
{
grid=board;
int i,j,k;
n=board.size();
m=board[0].size();
memset(sum,0,sizeof(sum));
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
sum[(int)board[i][j]]++;
}
}
for (i=0;i<260;i++)
{
for (j=0;j<260;j++)
{
dis[i][j]=100000;
}
}
for (i=0;i<260;i++) dis[i][i]=0;
start=0;
finish=1;
for (i=0;i<n;i++)
{
left=(int)board[i][0];
right=(int)board[i][m-1];
dis[start][left]=0;
dis[right][finish]=sum[right];
}
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
addedge(i,j,i+1,j);
addedge(i,j,i-1,j);
addedge(i,j,i,j+1);
addedge(i,j,i,j-1);

addedge(i,j,i+1,j+1);
addedge(i,j,i-1,j-1);
addedge(i,j,i+1,j-1);
addedge(i,j,i-1,j+1);
}
}
for (k=0;k<260;k++)
{
for (i=0;i<260;i++)
{
for (j=0;j<260;j++)
{
if (i==j||j==k||i==k) continue;
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
return dis[start][finish];
}
};


View Code
==================================

第一次用,TC客户端的插件,怎么说呢,相当方便。省去了每次粘类名的麻烦,它都给自动生成,而且测试也简单的多。

总之这次比赛还算满意的,虽然比赛后仍是灰名,但rating涨了104,也是醉了,还没有绿名。

这次写了两道题,第三道因为写的略微麻烦没有写完,嘛,反正最后也是参考了别人的代码才得以简化的。

【一点经验】图论题目如果点少的话还是尽量用邻接矩阵,这样也不容易出错,代码写的也快,尤其是对TC这种短时间的比赛
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: