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;
}

浙公网安备 33010602011771号