Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:论看memory limit的重要性,九千多k水过水过~

Posted by miubiu at 2018-01-24 15:45:12 on Problem 1751
In Reply To:论看memory limit的重要性,九千多k Posted by:miubiu at 2018-01-24 15:44:50
> //~ #define LOCAL
> 
> #include<cstdio>
> #include<vector>
> #include<algorithm>
> #include<cmath>
> 
> using namespace std;
> 
> #define rep(a, b) for(int i = a; i <= b; i++)
> 
> const int MAX = 800;
> 
> bool store[MAX][MAX];
> int rcnt;
> 
> struct Point
> {
> 	int u, v;
> 	int x, y;
> } s[MAX], road[MAX];
> 
> struct Ufs
> {
> 	int prt[MAX];
> 
> 	void init(int n)
> 	{
> 		rep(1, n)
> 			prt[i] = i;
> 		return;
> 	}
> 
> 	int findprt(int x)
> 	{
> 		while(x != prt[x])
> 			x = prt[x];
> 		return x;
> 	}
> 
> 	bool unite(int x, int y)
> 	{
> 		int px = findprt(x);
> 		int py = findprt(y);
> 		prt[x] = prt[y] = prt[px] = prt[py] = min(px, py);
> 		return px != py;
> 	}
> };
> 
> struct Kruskal
> {
> 	struct Edge
> 	{
> 		int u, v;
> 		double w;
> 		Edge(int uu, int vv, double ww):u(uu), v(vv), w(ww){}
> 		friend bool operator <(Edge a, Edge b)
> 		{
> 			return a.w < b.w;
> 		}
> 	};
> 
> 	vector<Edge> e;
> 	Ufs u;
> 
> 	void init(void)
> 	{
> 		e.clear();
> 	}
> 
> 	void addedge(int u, int v, double w)
> 	{
> 		e.push_back(Edge(u, v, w));
> 		return;
> 	}
> 
> 	void solve(int n)
> 	{
> 		int cnt = 0;
> 		u.init(n);
> 		int len = e.size();
> 		sort(e.begin(), e.end());
> 		rep(0, len - 1)
> 		{
> 			if(u.unite(e[i].u, e[i].v))
> 			{
> 				cnt++;
> 				if(e[i].w != 0)
> 				{
> 					road[rcnt].u = e[i].u;
> 					road[rcnt++].v = e[i].v;
> 				}
> 			}
> 			if(cnt == n - 1)
> 				break;
> 		}
> 	}
> } k;
> 
> int main()
> {
> 
> #ifdef LOCAL
> 	freopen("in.txt", "r", stdin);
> #endif
> 
> 	int n;
> 	scanf("%d", &n);
> 	rep(1, n)
> 		scanf("%d%d", &s[i].x, &s[i].y);
> 
> 	int tmpnum;
> 	scanf("%d", &tmpnum);
> 	while(tmpnum--)
> 	{
> 		int u, v;
> 		scanf("%d%d", &u, &v);
> 		store[u][v] = store[v][u] = true;
> 	}
> 
> 	rep(1, n - 1)
> 		for(int j = i + 1; j <= n; j++)
> 			if(!store[i][j])
> 			{
> 				double tmp = sqrt((double)(s[i].x - s[j].x) * (double)(s[i].x - s[j].x) + (double)(s[i].y - s[j].y) * (double)(s[i].y - s[j].y));
> 				k.addedge(i, j, tmp);
> 			}
> 			else
> 				k.addedge(i, j, 0);
> 
> 	k.solve(n);
> 
> 	rep(0, rcnt - 1)
> 		printf("%d %d\n", road[i].u, road[i].v);
> 	return 0;
> }

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator