0816胡策

一套图论的题,
T1 正解二分+网络流判断,不会,感觉模拟毛问题,模拟贪心了一发,A了,速度秒杀正解,但我不确定对于更大的数据这个算法是否是正确的。
T2 看错题O_O 以为每个人只能选一条边,然后就是个二分图。。。。写了个Dinic,什么都跑不出来,最后看了题解。。才看到每个人可以选任意条边,然后就成了个sb的最大生成树。
T3 三遍最短路,第一遍和第二遍从终点开始spfa,处理出各个点到终点的距离,第三遍从起点spfa,算到终点的最小错误数。一开始前两遍spfa从起点开始,得了70分,数据不行啊,最后改了一下AC。

实际上我是得不到这么多分的,第一题算是很早前就看过题面,那时就YY了贪心做法,一直没搞,现在抱着随便搞一搞的心态写了就A了,如果在考场Debuff的影响下,估计很难看出第二题思路错误和第三题程序错误。
以后考试还是要更严肃的模拟考试气氛,提高造数据和调试能力,解决烦躁看错题的毛病

代码如下

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
int a[200];

bool judge(int x)
{
	return sqrt(x)*sqrt(x) == x;
	
}

int main()
{
	freopen("ball.in","r",stdin);
	freopen("ball.out","w",stdout);
	int n;scanf("%d",&n);
	int ans = 1;
	int i = 1;
	for(i = 1;;i++)
	{
		int flag = 1;
		for(int j = 1;j <= ans;j++)
		{
			if(judge(a[j]+i)){
				flag = 0;
				a[j] = i;
				break;
			}			
		}
		if(flag){
			ans++;
			a[ans] = i;
		}
		if(ans > n) break;
	}
	printf("%d",i-1);
	return 0;
}
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<queue>
#include<cstring>
#include<stack>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 200000;
struct edge{
	int from,to,dist;
}e[maxn];


int pa[maxn];
int find(int x)
{
	if(x == pa[x]) return x;
	else return pa[x] = find(pa[x]);
}
bool A(edge a,edge b){
	return a.dist > b.dist;
}
int main()
{
	freopen("conscription.in","r",stdin);
	freopen("conscription.out","w",stdout);
	int T;
	scanf("%d",&T);
	while(T--){
		int n,m,r;
		scanf("%d%d%d",&n,&m,&r);
		int ans = (n+m)*10000;
		for(int i = 0;i <= n+m;i++)	pa[i] = i;
		for(int i = 1;i <= r;i++)
		{
			int from,to,dist;
			scanf("%d%d%d",&from,&to,&dist);
			e[i].from = from;e[i].to = to+n;e[i].dist = dist;
		}		
		sort(e+1,e+1+r,A);
		int k = 0;
		for(int i = 1;i <= r;i++){
			edge ex = e[i];
			int x = find(ex.from );
			int y = find(ex.to);
			if(x != y){
				pa[x] = y;
				k+=ex.dist ;
				find(pa[x]);
			}
		}		
		printf("%d\n",ans-k);		
	}
	return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<set>
#include<queue>
using namespace std;
const int maxn = 200000;
struct edge{
	int from,to,d1,d2,v;
	edge(int from,int to,int d1,int d2):
		from(from),to(to),d1(d1),d2(d2){v = 0;}
};
vector<edge> e;
vector<int> G1[maxn],G2[maxn],G3[maxn];
int n,k;
const int INF = 0x7fffffff;
int d1[maxn],d2[maxn],d3[maxn],inq[maxn];
void spfa1()
{
	memset(inq,0,sizeof(inq));
	for(int i = 1;i <= n;i++) d1[i] = INF;
	d1[n] = 0;
	inq[n] = 1;
	queue<int> Q;
	Q.push(n);
	while(!Q.empty()){
		int x = Q.front();Q.pop();
		inq[x] = 0;
		for(int i = 0; i < G1[x].size();i++){
			edge ek = e[G1[x][i]];
			if(ek.d1 + d1[x] < d1[ek.from]){
				d1[ek.from] = ek.d1 + d1[x];
				if(!inq[ek.from]){
					Q.push(ek.from);
				}
			}
		}
	}
}
void spfa2()
{
	memset(inq,0,sizeof(inq));
	for(int i = 1;i <= n;i++) d2[i] = INF;
	d2[n] = 0;
	inq[n] = 1;
	queue<int> Q;
	Q.push(n);
	while(!Q.empty()){
		int x = Q.front();Q.pop();
		inq[x] = 0;
		for(int i = 0; i < G2[x].size();i++){
			edge ek = e[G2[x][i]];
			if(ek.d2 + d2[x] < d2[ek.from]){
				d2[ek.from] = ek.d2 + d2[x];
				if(!inq[ek.from]){
					Q.push(ek.from);
				}
			}
		}
	}
}
int spfa3()
{
	memset(inq,0,sizeof(inq));
	for(int i = 1;i <= n;i++) d3[i] = INF;
	d3[1] = 0;
	inq[1] = 1;
	queue<int> Q;
	Q.push(1);
	while(!Q.empty()){
		int x = Q.front();Q.pop();
		inq[x] = 0;
		for(int i = 0; i < G3[x].size();i++){
			edge ek = e[G3[x][i]];
			if(ek.v + d3[x] < d3[ek.to]){
				d3[ek.to] = ek.v + d3[x];
				if(!inq[ek.to]){
					Q.push(ek.to);
				}
			}
		}
	}
	return d3[n];
}


int main()
{
	freopen("gpsduel.in","r",stdin);
	freopen("gpsduel.out","w",stdout);
	scanf("%d%d",&n,&k);
	for(int i = 1;i <= k;i++)
	{
		int from,to,d1,d2;
		scanf("%d%d%d%d",&from,&to,&d1,&d2);
		e.push_back(edge(from,to,d1,d2));
		G1[to].push_back(e.size()-1);
		G2[to].push_back(e.size()-1);
		G3[from].push_back(e.size()-1);
	}
	spfa1();
	spfa2();
	for(int i = 0;i < k;i++){
		if(d1[e[i].to]+e[i].d1 != d1[e[i].from]) e[i].v++;
		if(d2[e[i].to]+e[i].d2 != d2[e[i].from]) e[i].v++;
//		printf("边信息 %d %d %d %d %d\n",e[i].from,e[i].to,e[i].d1,e[i].d2,e[i].v);
//		printf("最短路信息 %d %d %d %d\n",d1[e[i].from],d1[e[i].to],d2[e[i].from],d2[e[i].to]);
	}
	printf("%d",spfa3());
	return 0;
}
posted @ 2017-08-17 22:47  rsqppp  阅读(140)  评论(0)    收藏  举报