0x3f3f3f3f意思详细介绍
0x3f3f3f3f意思详细介绍
不少用户在使用电脑的时候都接触过0x3f3f3f3f这个数值但是大多数都不知道这是什么意思,今天本文就给大家带来了0x3f3f3f3f意思详细介绍,快来了解一下吧。
0x3f3f3f3f是什么意思:
1、整数的两倍不超过 0x7f7f7f7f,则int表示的最大正整数。
2、整数的第八位字节都是相同的,在程序设计中经常需要使用 memset(a, val, sizeof a) 初始化一个数组a,
语句把数值 val(0x00~0xFF)填充到数组a 的每个字节,所用memset只能赋值出“每8位都相同”的 int。
3、当你需要吧一个数组中的数值初始化成正无穷大时就需要用0x3f3f3f3f数值代替,避免加法算数溢出。
以上就是为大家整理的0x3f3f3f3f意思详细介绍,是非常重要的数值能够很好的帮你进行编程,更多相关信息可以继续关注百科书哦~
C++实习题 高手来
你被分配到设计在广域某些点之间的网络连接。你是给该地区的一个点集,以及可能的路线,可能的电缆连接点对。对于每两点之间可能的途径,您将得到的是需要在这条道路连接点电缆长度。请注意有可能存在两种可能由于点多线。据推测,可能是由于线路连接(直接或间接)在该地区的每两点。
??你的任务是设计的区域网络,从而有一个连接(直接或间接每两点之间)(即各点是相互关联的,但不一定是直接电缆),而且总长度所使用的电缆是最小的。
输入格式:(b4.in)
??输入文件包含的数据集的数目。每个数据集定义一个所需的网络。集合的第一行包含两个整数:首先定义了给定的点的数量P和第二所给予航线之间的点数R。 R线以下两点之间的定义给定的路线,各以三个整数:前两个数字识别点,第三给出了路线的长度。这些数字之间用空格。一个数据集只给一个数P = 0表示的输入端。数据集之间用一个空行。
??点的最大数量为50。在某航线的最大长度为100。可能的路线是无限的。这些节点的确定1和P之间的整数(含)。两点之间的路线i和j可以得到尽可能ij或为J岛
输出格式:(b4.out)
??对于每个数据集,一个号码印刷在单独行给出了整个设计的网络中使用的电缆总长度。
Sample Input:
1 0
2 3
1 2 37
2 1 17
1 2 68
3 7
1 2 19
2 3 11
3 1 7
1 3 5
2 3 89
3 1 91
1 2 32
5 7
1 2 5
2 3 7
2 4 8
4 5 11
3 5 10
1 5 6
4 2 12
0
Sample Output:
0
17
16
26
在求最小费用流时,采用消除负费用圈的算法;怎么样用代码查找到负费用圈;求代码
你可以先做一下POJ2175这个题:
关于查找负费用圈:
用spfa循环超过n次跳转出来,说明有负圈,在spfa中纪录某个节点的前驱节点pre,跳转后从任意一个点开始沿pre找第一个访问过的节点,则这个点一定在负圈上。
然后根据这个点沿pre继续找,就可以遍历这个负圈。
以下是代码:
#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
#define inf 0x3f3f3f3f
#define N 250
#define M 20500
struct node
{
int x,y;
int c;
}a[205];
int e,head[N],pnt[M],nxt[M],cost[M];
void addedge(int u,int v,int c)
{
pnt[e]=v;
nxt[e]=head[u];
cost[e]=c;
head[u]=e++;
}
int cal(node a,node b)
{
return abs(a.x-b.x)+abs(a.y-b.y)+1;
}
int b[N][N];
int dist[N],cnt[N],pre[N];
char vis[N];
int relax(int u,int v,int c)
{
if(dist[v]>dist[u]+c)
{
dist[v]=dist[u]+c;
pre[v]=u;
return 1;
}
return 0;
}
int spfa(int s,int n)
{
int i,u;
queue<int>q;
for(i=1;i<=n;i++)
dist[i]=inf;
memset(pre,-1,sizeof(pre));
memset(vis,0,sizeof(vis));
memset(cnt,0,sizeof(cnt));
dist[s]=0; cnt[s]++;
q.push(s); vis[s]=1;
while(!q.empty())
{
u=q.front();q.pop();
vis[u]=0;
for(i=head[u];i!=-1;i=nxt[i])
if(relax(u,pnt[i],cost[i])==1&&vis[pnt[i]]==0)
{
vis[pnt[i]]=1;
q.push(pnt[i]);
if(++cnt[pnt[i]]>n) return pnt[i];
}
}
return 0;
}
int sum[N];
int main()
{
int n,m,i,j,c,u;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].c);
for(i=1;i<=m;i++)
scanf("%d%d%d",&a[i+n].x,&a[i+n].y,&a[i+n].c);
e=0;memset(head,-1,sizeof(head));
memset(sum,0,sizeof(sum));
memset(b,0,sizeof(b));
for(i=1;i<=n;i++)//剩余网络,只要边上的流量小于容量,则连边,因为源点满流,所以源点可忽略
for(j=1;j<=m;j++)
{
scanf("%d",&c);
sum[j]+=c;
b[i][j+n]=c;
int len=cal(a[i],a[j+n]);
addedge(i,j+n,len);
if(c>0)
addedge(j+n,i,-len);
}
for(j=1;j<=m;j++)
{
if(sum[j]!=0)
addedge(m+n+1,j+n,0);
if(sum[j]<a[j+n].c)
addedge(j+n,m+n+1,0);
}
int flag=spfa(m+n+1,m+n+1); //判断有没有负圈
if(flag)
{
printf("SUBOPTIMAL
");
u=flag;
memset(vis,0,sizeof(vis));
while(!vis[u]) //确定负圈中的一个点,因为在负圈中的必重复出现
{
vis[u]=1; u=pre[u];
}
flag=u;
do //更新流量
{
if(pre[u]<=n&&u>n)
b[pre[u]][u]++;
if(pre[u]>n&&u<=n)
b[u][pre[u]]--;
u=pre[u];
}while(u!=flag);
for(i=1;i<=n;i++,puts(""))
for(j=1;j<=m;j++)
printf("%d ",b[i][j+n]);
}
else
printf("OPTIMAL
");
}
return 0;
}
间谍网络 跪求答案!
tarjan缩点,然后拓扑,判断入度为0的大点里面有没有能收买的,全有就记录总和,有一个没有就输出no,然后tarjan过程中记录最小编号
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define mod 1e9+7
const int maxn=3005;
const int maxm=8005;
struct edge
{
int to,next;
}g[maxm];
int head[maxn],cnt=0;
int n,p,m;
int val[maxn];
int ans=0;
int dfn[maxn],low[maxn],t=0;
int cost[maxn];
stack<int> s;
int in[maxn];
int is[maxn],bcc_cnt=0;
int id_min[maxn];
bool color[maxn];
inline void add(int a,int b)
{
g[++cnt].to=b;
g[cnt].next=head[a];
head[a]=cnt;
return ;
}
void tarjan(int u)
{
dfn[u]=low[u]=++t;
s.push(u);
for(int i=head[u];i;i=g[i].next)
{
int v=g[i].to;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(!is[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
bcc_cnt++;
while(1)
{
int x=s.top();
s.pop();
is[x]=bcc_cnt;
id_min[bcc_cnt]=min(id_min[bcc_cnt],x);
if(val[x]!=0x3f3f3f3f)
{
cost[bcc_cnt]=min(cost[bcc_cnt],val[x]);
color[bcc_cnt]=1;
}
if(x==u) break;
}
}
return ;
}
int main()
{
scanf("%d",&n);
memset(val,0x3f,sizeof(val));
memset(in,0,sizeof(in));
memset(id_min,0x3f,sizeof(id_min));
scanf("%d",&p);
while(p--)
{
int a,b;
scanf("%d%d",&a,&b);
val[a]=b;
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
}
memset(cost,0x3f,sizeof(cost));
for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
for(int i=1;i<=n;i++)
{
for(int j=head[i];j;j=g[j].next)
{
int v=g[j].to;
if(is[i]!=is[v]) in[is[v]]++;
}
}
int flag=1;
for(int i=1;i<=bcc_cnt;i++)
{
if(!in[i]&&color[i]) ans+=cost[i];
else if(!in[i]&&color[i]==0) flag=0;
}
if(flag)
{
printf("YES ");
printf("%d",ans);
return 0;
}
ans=0x3f3f3f3f;
printf("NO ");
for(int i=1;i<=n;i++)
{
for(int j=head[i];j;j=g[j].next)
{
int v=g[j].to;
if(color[is[i]]&&is[i]!=is[v]) color[is[v]]=1;
}
}
for(int i=1;i<=bcc_cnt;i++) if(!color[i]) ans=min(ans,id_min[i]);?
printf("%d",ans);
return 0;
}
声明: 我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本站部分文字与图片资源来自于网络,转载是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们(管理员邮箱:daokedao3713@qq.com),情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!