#include<stdio.h>
#include<stdlib.h>
typedef struct treeNode *tree;
struct treeNode{
int v;
tree right,left;
};
tree Maketree(int n);
tree NewNode(int V);
tree Insert(int v,tree T);
int Judge(tree T1,tree T2);
void Freetree(tree t);
int main()
{
int n,l,i;
tree T;
scanf("%d",&n);
while(n)
{
scanf("%d",&l);
T=Maketree(n);
for(i=0;i<l;i++)
{
tree tempt;
tempt=Maketree(n);
if(Judge(T,tempt))
printf("Yes\n");
else
printf("No\n");
Freetree(tempt);
}
Freetree(T);
scanf("%d",&n);
}
system("pause");
return 0;
}
tree Maketree(int n)
{
int v,i;
tree T;
scanf("%d",&v);
T=NewNode(v);
for(i=1;i<n;i++)
{
scanf("%d",&v);
T=Insert(v,T);
}
return T;
}
tree NewNode(int v)
{
tree T;
T=(tree)malloc(sizeof(struct treeNode));
T->v=v;
T->left=NULL;T->right=NULL;
return T;
}
tree Insert(int v,tree T)
{
if(!T)
T=NewNode(v);
else
{
if(v>T->v)
T->right=Insert(v,T->right);
else
T->left=Insert(v,T->left);
}
return T;
}
int Judge(tree T1,tree T2)
{
if(T1==NULL&&T2==NULL)
return 1;
else if((T1==NULL&&T2!=NULL)||(T1!=NULL&&T2==NULL))
return 0;
else if(T1->v!=T2->v)
return 0;
else
return Judge(T1->left,T2->left)&&Judge(T1->right,T2->right);
}
void Freetree(tree t)
{
if(t->left)
Freetree(t->left);
if(t->right)
Freetree(t->right);
free(t);
}
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1<<10+2;
int a[maxn],b[maxn];
int n,l;
void build1(){
memset(a,-1,sizeof(a));
for(int i=0;i<n;i++){
int id=1,x;
scanf("%d",&x);
while(1){
if(a[id]==-1){
a[id]=x;
break;
}
else if(x<a[id]){
id=id*2;
}
else
id=id*2+1;
}
}
}
void build2(){
memset(b,-1,sizeof(b));
for(int i=0;i<n;i++){
int id=1,x;
scanf("%d",&x);
while(1){
if(b[id]==-1){
b[id]=x;
break;
}
else if(x<b[id]){
id=id*2;
}
else
id=id*2+1;
}
}
}
int check(){
for(int i=1;i<maxn;i++)
if(a[i]!=b[i])
return 0;
return 1;
}
int main(){
while(cin>>n){
if(n==0) break;
cin>>l;
build1();
while(l--){
build2();
if(check()) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
return 0;
}
#include<iostream>
using namespace std;
#define MAX 1001
#define MIN -10001
int main()
{
int size=0,a[MAX];
a[0]=MIN;
int m,n,i,j,x,y;
cin>>n>>m;
for(i=0;i<n;i++)
{
cin>>x;
for(j=++size;x<a[j/2];j/=2)
a[j]=a[j/2];
a[j]=x;
}
for(i=0;i<m;i++)
{
cin>>y;
cout<<a[y];
for(j=y/2;j>=1;j=j/2)
cout<<" "<<a[j];
cout<<endl;
}
return 0;
}
#include<stdio.h>
#include<string.h>
#define MAXN 10
int visit[MAXN];
int G[MAXN][MAXN];
void dfs(int i,int N)
{
int j;
visit[i]=1;
printf(" %d",i);
for(j=0;j<N;j++)
{
if(!visit[j]&&G[i][j])
dfs(j,N);
}
}
void bfs(int i,int N)
{
int queue[MAXN],front,rear,v,j;
front=rear=-1;
visit[i]=1;
queue[++rear]=i;
while(front<rear)
{
v=queue[++front];
printf(" %d",v);
for(j=0;j<N;j++)
if(!visit[j]&&G[v][j])
{
queue[++rear]=j;
visit[j]=1;
}
}
}
int main()
{
int N,E,x,y,i;
scanf("%d %d",&N,&E);
memset(visit,0,sizeof(visit));
for(i=0;i<E;i++)
{
scanf("%d %d",&x,&y);
G[x][y]=G[y][x]=1;
}
for(i=0;i<N;i++)
{
if(!visit[i])
{
printf("{");
dfs(i,N);
printf(" }\n");
}
}
memset(visit,0,sizeof(visit));
for(i=0;i<N;i++)
{
if(!visit[i])
{
printf("{");
bfs(i,N);
printf(" }\n");
}
}
return 0;
}
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int mp[100][100];
int vis[100];
int n,e;
vector<int> v[13];
bool cmp1(int a,int b){
return a<b;
}
void dfs(int x){
cout<<x<<" ";
for(int i=0;i<v[x].size();i++){
int tmp=v[x][i];
if(!vis[tmp])
{
vis[tmp]=1;
dfs(tmp);
}
}
}
void bfs(int x){
queue<int> q;
q.push(x);
while(!q.empty()){
int cur=q.front();
cout<<cur<<" ";
q.pop();
for(int i=0;i<v[cur].size();i++){
int tmp=v[cur][i];
if(!vis[tmp]){
vis[tmp]=1;
q.push(tmp);
}
}
}
}
int main(){
cin>>n>>e;
vector<int>::iterator it;
while(e--){
int x,y;
cin>>x>>y;
it=lower_bound(v[x].begin(),v[x].end(),y);
v[x].insert(it,y);
it=lower_bound(v[y].begin(),v[y].end(),x);
v[y].insert(it,x);
}
for(int i=0;i<n;i++){
if(!vis[i]){
cout<<"{ ";
vis[i]=1;
dfs(i);
cout<<"}\n";
}
}
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++){
if(!vis[i]){
vis[i]=1;
cout<<"{ ";
bfs(i);
cout<<"}\n";
}
}
return 0;
}
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=1e3+4;
vector<int> v[maxn];
int vis[maxn];
int n,m;
int bfs(int x){
int lev[maxn],cnt=0;
queue<int> q;
q.push(x);
lev[x]=0;
while(!q.empty()){
int cur=q.front();
q.pop();
if(lev[cur]>6)
break;
cnt++;
for(int i=0;i<v[cur].size();i++){
int tmp=v[cur][i];
if(!vis[tmp]){
lev[tmp]=lev[cur]+1;
vis[tmp]=1;
q.push(tmp);
}
}
}
return cnt;
}
int main(){
cin>>n>>m;
int x,y;
while(m--){
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
int cnt=bfs(i);
cout<<i<<": ";
printf("%.2lf%%\n",(cnt-1)*100.0/n);
}
return 0;
}
#include<stdlib.h>
#include<stdio.h>
#define FULL 10001
int main()
{
int n,m;
int Length[101][101];
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
Length[i][j]=FULL;
}
int disk1,disk2;
for(int i=0;i<m;i++)
{
scanf("%d%d",&disk1,&disk2);
scanf("%d",&Length[disk1][disk2]);
Length[disk2][disk1]=Length[disk1][disk2];
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(Length[i][j]>Length[i][k]+Length[k][j])
Length[i][j]=Length[i][k]+Length[k][j];
}
}
}
int MAX=FULL,index;
for(int i=1;i<=n;i++)
{
int max=0;
for(int j=1;j<=n;j++)
{
if(j==i) continue;
if(Length[j][i]>max)
max=Length[j][i];
}
if(max<MAX)
{
MAX=max,index=i;
}
}
if(MAX>=FULL)
printf("0");
else
printf("%d %d",index,MAX);
return 0;
}
单源最短路径 从s到d dijkstra
#include<iostream>
#include<algorithm>
using namespace std;
int cost[505][505],mp[505][505];
int dis[505],cos[505];
int vis[505];
int n,m,s,d;
void dijkstra(){
int minn,v;
for(int i=0;i<n-2;i++){
minn=505;
for(int j=0;j<n;j++)
if(!vis[j]&&dis[j]<minn){
minn=dis[j];
v=j;
}
vis[v]=1;
for(int j=0;j<n;j++){
if(vis[j]) continue;
if(dis[j]>dis[v]+mp[v][j]){
dis[j]=dis[v]+mp[v][j];
cos[j]=cos[v]+cost[v][j];
}
else if(dis[j]==dis[v]+mp[v][j]&&cos[j]>cos[v]+cost[v][j])
cos[j]=cos[v]+cost[v][j];
}
}
}
int main(){
int x,y,l,c;
cin>>n>>m>>s>>d;
fill(cost[0],cost[0]+505*505,505);
fill(mp[0],mp[0]+505*505,505);
while(m--){
cin>>x>>y>>l>>c;
mp[x][y]=mp[y][x]=l;
cost[x][y]=cost[y][x]=c;
}
for(int i=0;i<n;i++){
dis[i]=mp[s][i];
cos[i]=cost[s][i];
}
vis[s]=1;
dijkstra();
cout<<dis[d]<<" "<<cos[d];
return 0;
}
克鲁斯卡尔(Kruskal)算法是实现图的最小生成树最常用的算法。
克鲁斯卡尔算法是一种用来寻找最小生成树的算法。在剩下的所有未选取的边中,找最小边,如果和已选取的边构成回路,则放弃,选取次小边。
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e3+3;
struct node{
int a,b,v;
}s[3*maxn];
int f[maxn];
int n,m;
bool cmp1(const node& x,const node& y){
return x.v<y.v;
}
int find(int x){
return f[x]==x?x:f[x]=find(f[x]);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=0;i<m;i++){
cin>>s[i].a>>s[i].b>>s[i].v;
}
sort(s,s+m,cmp1);
if(m<n-1){
cout<<"-1";
return 0;
}
int sum=0,cn=0;
for(int i=0;i<m;i++){
int x1=s[i].a,y1=s[i].b;
x1=find(x1),y1=find(y1);
if(x1==y1) continue;
if(x1>y1)
swap(x1,y1);
f[y1]=x1;
sum+=s[i].v;
cn++;
}
if(cn!=n-1)
cout<<"-1";
else
cout<<sum;
return 0;
}
没有想到现在就用到了这么复杂的算法=:)=
在现代化管理中,人们常用有向图来描述和分析一项工程的计划和实施过程,一个工程常被分为多个小的子工程,这些子工程被称为活动(Activity),在带权有向图中若以顶点表示事件,有向边表示活动,边上的权值表示该活动持续的时间,这样的图简称为AOE网。
有权值的拓扑排序
AOE网
拓扑排序与关键路径
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn=100+7;
struct Edge{
int from,to,next,time;
}edge[maxn*1000],edge2[maxn*1000];
struct Node{
int s,e;
bool operator <(const Node &another)const{
return s>another.s;
}
Node(int a,int b):s(a),e(b){}
};
int n,m,tot,tot2,head[maxn],head2[maxn];
int in[maxn],out[maxn],ve[maxn],vl[maxn],Max;
void addEdge(int a,int b,int c){
edge[tot].from=a;edge[tot].to=b;
edge[tot].time=c;
edge[tot].next=head[a],head[a]=tot++;
}
void addEdge2(int a,int b,int c){
edge2[tot2].from=a;edge2[tot2].to=b;
edge2[tot2].time=c;
edge2[tot2].next=head2[a],head2[a]=tot2++;
}
bool TupoSort(){
queue<int> que;
memset(ve,0,sizeof(ve));
for(int i=1;i<=n;i++)
if(in[i]==0)
que.push(i);
int cnt=0;
while(!que.empty()){
cnt++;
int p=que.front();
que.pop();
for(int i=head[p];~i;i=edge[i].next){
in[edge[i].to]--;
if(ve[edge[i].to]<ve[p]+edge[i].time){
ve[edge[i].to]=ve[p]+edge[i].time;
}
if(!in[edge[i].to]) que.push(edge[i].to);
}
}
if(cnt!=n) return false;
return true;
}
void ReTupoSort(){
memset(vl,INF,sizeof(vl));
queue<int> que;
for(int i=1;i<=n;i++){
if(out[i]==0){
que.push(i);
vl[i]=Max;
}
}
while(!que.empty()){
int p=que.front();
que.pop();
for(int i=head2[p];~i;i=edge2[i].next){
out[edge2[i].to]--;
if(vl[edge2[i].to]>vl[p]-edge2[i].time)
vl[edge2[i].to]=vl[p]-edge2[i].time;
if(!out[edge2[i].to])
que.push(edge2[i].to);
}
}
}
int main(){
tot=tot2=0;
memset(head,-1,sizeof(head));
memset(head2,-1,sizeof(head2));
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
int a,b,v;
scanf("%d %d %d",&a,&b,&v);
addEdge(a,b,v);
addEdge2(b,a,v);
in[b]++;
out[a]++;
}
if(!TupoSort()) printf("0\n");
else{
Max=-1;
for(int i=1;i<=n;i++){
if(out[i]==0)
Max=max(Max,ve[i]);
}
cout<<Max<<endl;
ReTupoSort();
priority_queue<Node> que;
for(int i=1;i<=n;i++){
if(ve[i]!=vl[i]) continue;
for(int j=head[i];~j;j=edge[j].next){
if(ve[i]==vl[edge[j].to]-edge[j].time)
que.push(Node(i,edge[j].to));
}
}
while(!que.empty()){
Node node=que.top();
que.pop();
printf("%d->%d\n",node.s,node.e);
}
}
return 0;
}
还是不够细心,考虑问题不够全面
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
double x[5];
int i;
}s[250];
int s1[250][5];
int t;
bool cmp1(node a,node b){
return a.x[t]>b.x[t];
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>s[i].x[0]>>s[i].x[1]>>s[i].x[2];
s[i].x[3]=s[i].x[0]/s[i].x[2];
s[i].x[4]=s[i].x[1]/s[i].x[2];
s[i].i=i;
}
/* for(int i=0;i<n;i++)
{
for(int j=0;j<4;j++)
cout<<s[i].x[j]<<" ";
cout<<endl;
}*/
for(t=0;t<5;t++){
if(t==2) continue;
sort(s,s+n,cmp1);
int tmp0=s[0].i,tmp1;
s1[tmp0][t]=1;
for(int i=1;i<n;i++){
tmp1=s[i].i;
if(s[i].x[t]==s[i-1].x[t])
s1[tmp1][t]=s1[tmp0][t];
else
s1[tmp1][t]=i+1;
tmp0=tmp1;
}
/* for(int i=0;i<n;i++)
for(int j=0;j<4;j++)
cout<<s1[i][j]<<" ";
cout<<endl; */
}
while(m--){
int x,minn=250,u;
cin>>x;
for(int i=0;i<5;i++){
if(s1[x][i]<minn&&i!=2){
minn=s1[x][i];
if(i<2)
u=i+1;
else
u=i;
}
}
cout<<minn<<":"<<u;
if(m) cout<<" ";
}
return 0;
}
#include<stdio.h>
void Hanoi(int n,int a,int b,int c){
if(1==n)
printf("%c -> %c\n",a,c);
else{
Hanoi(n-1,a,c,b);
Hanoi(1,a,b,c);
Hanoi(n-1,b,a,c);
}
}
int main(){
int N;
scanf("%d",&N);
Hanoi(N,'a','b','c');
return 0;
}
思路很巧妙
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,x,len=0,flag=0;
scanf("%d",&n);
int * a=(int *)malloc(sizeof(int)*n);
while(scanf("%d",&x)){
if(x<0) break;
a[len++]=x;
if(!flag){
if(len>=n)
{
len%=n;
flag=1;
}
}
if(len>=n)
len%=n;
}
if(!flag) cout<<"NULL";
else printf("%d",a[len]);
return 0;
}