想起来优快云可以拿来写作业记录qvq
目录
B:算法7-12 有向无环图的拓扑排序
·第一次WA的原因未知
#include<bits/stdc++.h>
#define MAX_SIZE 100
using namespace std;
vector<int> out;
struct Graph{
int nodeNumber;
int Info[MAX_SIZE];
int adjMatrix[MAX_SIZE][MAX_SIZE];
};
void CalculateDegree(const Graph& g,int inDegree[])
{
for(int i=0;i<g.nodeNumber;i++)
{
for(int j=0;j<g.nodeNumber;j++){
if(g.adjMatrix[i][j])
{
inDegree[j]++;
}
}
}
}
void Topo(const Graph& g,int inDegree[])
{
int vis[g.nodeNumber]={0},cnt=0,i;
stack<int>S;
for(i=0;i<g.nodeNumber;i++)
{
if(inDegree[i]==0){S.push(i);vis[i]=1;}
}
while(!S.empty())
{
i=S.top();
S.pop();
out.push_back(i);cnt++;
for(int j=0;j<g.nodeNumber;j++)
{
if(g.adjMatrix[i][j]==1&&inDegree[j]!=0)
{
inDegree[j]--;
}
if(inDegree[j]==0&&!vis[j])
{
S.push(j);
vis[j]=1;
}
}
}
if(cnt<g.nodeNumber)
{
cout<<"ERROR"<<endl;return ;
}
else
{
for(int j=0;j<out.size();j++)
cout<<out[j]<<" ";
cout<<endl;
}
}
int main()
{
Graph g;
cin>>g.nodeNumber;
int inDegree[g.nodeNumber]={0};
for(int i=0;i<g.nodeNumber;i++)
{
for(int j=0;j<g.nodeNumber;j++){
cin>>g.adjMatrix[i][j];
}
}
CalculateDegree(g,inDegree);
Topo(g,inDegree);
return 0;
}
C:有向图是否存在环?
·能拓扑就有环
#include<bits/stdc++.h>
#define MAX_SIZE 100
using namespace std;
vector<int> out;
struct Graph{
int nodeNumber;
int Info[MAX_SIZE];
int adjMatrix[MAX_SIZE][MAX_SIZE];
};
void CalculateDegree(const Graph& g,int inDegree[])
{
for(int i=0;i<g.nodeNumber;i++)
{
for(int j=0;j<g.nodeNumber;j++){
if(g.adjMatrix[i][j])
{
inDegree[j]++;
}
}
}
}
void Topo(const Graph& g,int inDegree[])
{
int vis[g.nodeNumber]={0},cnt=0,i;
stack<int>S;
for(i=0;i<g.nodeNumber;i++)
{
if(inDegree[i]==0){S.push(i);vis[i]=1;}
}
while(!S.empty())
{
i=S.top();
S.pop();
out.push_back(i);cnt++;
for(int j=0;j<g.nodeNumber;j++)
{
if(g.adjMatrix[i][j]==1&&inDegree[j]!=0)
{
inDegree[j]--;
}
if(inDegree[j]==0&&!vis[j])
{
S.push(j);
vis[j]=1;
}
}
}
if(cnt<g.nodeNumber)
{
cout<<"YES"<<endl;return ;
}
else
{
cout<<"NO"<<endl;
}
}
int main()
{
int n,m,u,v;
while(cin>>n)
{
if(n==0)break;
Graph g;
g.nodeNumber=n;
cin>>m;
int inDegree[g.nodeNumber]={0};
while(m--){
cin>>u>>v;
g.adjMatrix[u-1][v-1]=1;
}
CalculateDegree(g,inDegree);
Topo(g,inDegree);
}
return 0;
}
D:是否为有效的拓扑序列
·判断每点的入度是否为零即可
·要记得入度数组的初始化!
#include<bits/stdc++.h>
#define MAX_SIZE 100
using namespace std;
struct Graph{
int nodeNumber;
int Info[MAX_SIZE];
int adjMatrix[MAX_SIZE][MAX_SIZE];
};
void CalculateDegree(const Graph& g,int inDegree[])
{
for(int i=0;i<g.nodeNumber;i++)
{
for(int j=0;j<g.nodeNumber;j++){
if(g.adjMatrix[i][j])
{
inDegree[j]++;
}
}
}
}
void Topo(const Graph& g,int num[])
{
int vis[g.nodeNumber]={0},cnt=0,i,flag=1,dex;
int Q[g.nodeNumber];
#初始化
int inDegree[g.nodeNumber]={0};
CalculateDegree(g,inDegree);
for(i=0;i<g.nodeNumber;i++)
{
if(inDegree[num[i]]==0)
{
for(int j=0;j<g.nodeNumber;j++)
{
if(g.adjMatrix[num[i]][j]==1)
{
inDegree[j]--;
}
}
}
else {
flag=0;
break;
}
}
if(!flag){cout<<"NO"<<endl;return;}
cout<<"YES"<<endl;
}
int main()
{
int n,m,u,v,t;
cin>>n;
Graph g;
g.nodeNumber=n;
cin>>m;
int inDegree[g.nodeNumber]={0};
while(m--){
cin>>u>>v;
g.adjMatrix[u][v]=1;
}cin>>t;
while(t--)
{
int num[g.nodeNumber];
for(int i=0;i<g.nodeNumber;i++)cin>>num[i];
Topo(g,num);
}
return 0;
}
E:案例6-2.6:最短工期
·在板子里加上状态转移函数
#include<bits/stdc++.h>
#define MAX_SIZE 100
using namespace std;
struct Graph{
int nodeNumber;
int Info[MAX_SIZE];
int weight[MAX_SIZE][MAX_SIZE];
int adjMatrix[MAX_SIZE][MAX_SIZE];
};
void CalculateDegree(const Graph& g,int inDegree[])
{
for(int i=0;i<g.nodeNumber;i++)
{
for(int j=0;j<g.nodeNumber;j++){
if(g.adjMatrix[i][j])
{
inDegree[j]++;
}
}
}
}
void Topo(const Graph& g)
{
int vis[g.nodeNumber]={0},cnt=0,i,flag=1,dex;
int inDegree[g.nodeNumber]={0};
CalculateDegree(g,inDegree);
stack<int>S;
for(int i=0;i<g.nodeNumber;i++)
{
if(inDegree[i]==0)
{
S.push(i);vis[i]=1;
}
}
int sum=0;
int ans[g.nodeNumber]={0},maxx=0;
while(!S.empty())
{
i=S.top();
S.pop();
out.push_back(i);
for(int j=0;j<g.nodeNumber;j++)
{
if(g.adjMatrix[i][j]==1&&inDegree[j]!=0)
{
inDegree[j]--;
#状态转移,找到每条支路最大权和
ans[j]=max(g.weight[i][j]+ans[i],ans[j]);
sum=max(sum,ans[j]);
}
if(inDegree[j]==0&&!vis[j])
{
S.push(j);
vis[j]=1;
}
}
}
for(int i=0;i<g.nodeNumber;i++)
{
if(inDegree[i]!=0)
{
cout<<"Impossible"<<endl;return ;
}
}
cout<<sum<<endl;
}
int main()
{
int n,m,u,v,w,t;
cin>>n;
Graph g;
g.nodeNumber=n;
cin>>m;
int inDegree[g.nodeNumber]={0};
while(m--){
cin>>u>>v>>w;
g.adjMatrix[u][v]=1;
g.weight[u][v]=w;
}
Topo(g);
return 0;
}
F:图-节点的最早发生时间
·记下每个ans最后顺序输出就好了
#include<bits/stdc++.h>
#define MAX_SIZE 100
using namespace std;
vector<int> out;
struct Graph{
int nodeNumber;
int Info[MAX_SIZE];
int weight[MAX_SIZE][MAX_SIZE];
int adjMatrix[MAX_SIZE][MAX_SIZE];
};
void CalculateDegree(const Graph& g,int inDegree[])
{
for(int i=0;i<g.nodeNumber;i++)
{
for(int j=0;j<g.nodeNumber;j++){
if(g.adjMatrix[i][j])
{
inDegree[j]++;
}
}
}
}
void Topo(const Graph& g)
{
int vis[g.nodeNumber]={0},cnt=0,i,flag=1,dex;
int inDegree[g.nodeNumber]={0};
CalculateDegree(g,inDegree);
stack<int>S;
for(int i=0;i<g.nodeNumber;i++)
{
if(inDegree[i]==0)
{
S.push(i);vis[i]=1;
}
}
int sum=0;
int ans[g.nodeNumber]={0},maxx=0,j=0;
int num[g.nodeNumber]={0};
while(!S.empty())
{
i=S.top();
S.pop();
out.push_back(sum);
for(j=0;j<g.nodeNumber;j++)
{
if(g.adjMatrix[i][j]==1&&inDegree[j]!=0)
{
inDegree[j]--;
ans[j]=max(g.weight[i][j]+ans[i],ans[j]);
num[j]=ans[j];
// sum=max(sum,ans[j]);
}
if(inDegree[j]==0&&!vis[j])
{
S.push(j);
vis[j]=1;
}
}
}
for(int i=0;i<g.nodeNumber;i++)
cout<<num[i]<<endl;
}
int main()
{
int n,m,u,v,w,t;
cin>>n;
Graph g;
g.nodeNumber=n;
cin>>m;
int inDegree[g.nodeNumber]={0};
while(m--){
cin>>u>>v>>w;
g.adjMatrix[u][v]=1;
g.weight[u][v]=w;
}
Topo(g);
return 0;
}
G:图-节点的最迟发生时间
·理解了顺拓扑就能写逆拓扑啦
#include<bits/stdc++.h>
#define MAX_SIZE 100
using namespace std;
vector<int> out;
struct Graph{
int nodeNumber;
int Info[MAX_SIZE];
int ve[MAX_SIZE];
int vl[MAX_SIZE];
int weight[MAX_SIZE][MAX_SIZE];
int adjMatrix[MAX_SIZE][MAX_SIZE];
};
void CalculateDegree(const Graph& g,int inDegree[],int outDegree[])
{
for(int i=0;i<g.nodeNumber;i++)
{
for(int j=0;j<g.nodeNumber;j++){
if(g.adjMatrix[i][j])
{
inDegree[j]++;
outDegree[i]++;
}
}
}
}
void Topo(Graph& g)
{
int vis[g.nodeNumber]={0},cnt=0,i,flag=1,dex;
int inDegree[g.nodeNumber]={0};
int outDegree[g.nodeNumber]={0};
CalculateDegree(g,inDegree,outDegree);
stack<int>S;
for(int i=0;i<g.nodeNumber;i++)
{
if(inDegree[i]==0)
{
S.push(i);vis[i]=1;
}
}
int sum;
int ans[g.nodeNumber]={0};
while(!S.empty())
{
i=S.top();
S.pop();
// out.push_back(i);
for(int j=0;j<g.nodeNumber;j++)
{
if(g.adjMatrix[i][j]==1&&inDegree[j]!=0)
{
inDegree[j]--;
ans[j]=max(g.weight[i][j]+ans[i],ans[j]);
g.ve[j]=ans[j];
sum=max(sum,ans[j]);
}
if(inDegree[j]==0&&!vis[j])
{
S.push(j);
vis[j]=1;
}
}
}
int vis1[g.nodeNumber]={0};
for(int i=0;i<g.nodeNumber;i++)
{
if(outDegree[i]==0)
{
S.push(i);vis1[i]=1;
}
}
int res[g.nodeNumber];
for(int i=0;i<g.nodeNumber;i++)res[i]=sum;
while(!S.empty())
{
i=S.top();
S.pop();
// out.push_back(i);
for(int j=0;j<g.nodeNumber;j++)
{
if(g.adjMatrix[j][i]==1&&outDegree[j]!=0)
{
outDegree[j]--;
res[j]=min(res[i]-g.weight[j][i],res[j]);
// g.vl[j]=res[j];
// sum=min(sum,ans[i]);
}
if(outDegree[j]==0&&!vis1[j])
{
// cout<<"j="<<j<<endl;
S.push(j);
vis1[j]=1;
}
}
}
for(int i=0;i<g.nodeNumber;i++)
cout<<res[i]<<endl;
}
int main()
{
int n,m,u,v,w,t;
cin>>n;
Graph g;
g.nodeNumber=n;
cin>>m;
int inDegree[g.nodeNumber]={0};
while(m--){
cin>>u>>v>>w;
g.adjMatrix[u][v]=1;
g.weight[u][v]=w;
}
Topo(g);
return 0;
}
H:图-边的最早发生时间
·好多数组啊,有空再改
#include<bits/stdc++.h>
#define MAX_SIZE 100
using namespace std;
vector<int> out;
int e[MAX_SIZE][MAX_SIZE];
int a[MAX_SIZE],b[MAX_SIZE];
int n,m,u,v,w,t;
struct Graph{
int nodeNumber;
int Info[MAX_SIZE];
int ve[MAX_SIZE];
int vl[MAX_SIZE];
int weight[MAX_SIZE][MAX_SIZE];
int adjMatrix[MAX_SIZE][MAX_SIZE];
};
void CalculateDegree(const Graph& g,int inDegree[],int outDegree[])
{
for(int i=0;i<g.nodeNumber;i++)
{
for(int j=0;j<g.nodeNumber;j++){
if(g.adjMatrix[i][j])
{
inDegree[j]++;
outDegree[i]++;
}
}
}
}
void Topo(Graph& g)
{
int vis[g.nodeNumber]={0},cnt=0,i,flag=1,dex;
int inDegree[g.nodeNumber]={0};
int outDegree[g.nodeNumber]={0};
CalculateDegree(g,inDegree,outDegree);
stack<int>S;
for(int i=0;i<g.nodeNumber;i++)
{
if(inDegree[i]==0)
{
S.push(i);vis[i]=1;
}
}
int sum;
int ans[g.nodeNumber]={0};
while(!S.empty())
{
i=S.top();
S.pop();
// out.push_back(i);
for(int j=0;j<g.nodeNumber;j++)
{
if(g.adjMatrix[i][j]==1&&inDegree[j]!=0)
{
inDegree[j]--;
ans[j]=max(g.weight[i][j]+ans[i],ans[j]);
g.ve[j]=ans[j];
sum=max(sum,ans[j]);
}
if(inDegree[j]==0&&!vis[j])
{
S.push(j);
vis[j]=1;
}
}
}
for(int i=0;i<g.nodeNumber;i++)
{
for(int j=0;j<g.nodeNumber;j++)
{
if(g.adjMatrix[i][j])
{
e[i][j]=g.ve[i];
}
}
}
for(int i=0;i<m;i++)
{
cout<<e[a[i]][b[i]]<<endl;
}
}
int main()
{
cin>>n;
Graph g;
g.nodeNumber=n;
cin>>m;
int inDegree[g.nodeNumber]={0};
int o=0;
int f=m;
while(f--){
cin>>u>>v>>w;
a[o]=u;b[o]=v;o++;
g.adjMatrix[u][v]=1;
g.weight[u][v]=w;
}
Topo(g);
return 0;
}
I: 图-边的最迟发生时间
·好怪,等下看看
#include<bits/stdc++.h>
#define MAX_SIZE 100
using namespace std;
vector<int> out;
int e[MAX_SIZE][MAX_SIZE],l[MAX_SIZE][MAX_SIZE];
int a[MAX_SIZE],b[MAX_SIZE];
int n,m,u,v,w,t;
struct Graph{
int nodeNumber;
int Info[MAX_SIZE];
int ve[MAX_SIZE];
int vl[MAX_SIZE];
int weight[MAX_SIZE][MAX_SIZE];
int adjMatrix[MAX_SIZE][MAX_SIZE];
};
void CalculateDegree(const Graph& g,int inDegree[],int outDegree[])
{
for(int i=0;i<g.nodeNumber;i++)
{
for(int j=0;j<g.nodeNumber;j++){
if(g.adjMatrix[i][j])
{
inDegree[j]++;
outDegree[i]++;
}
}
}
}
void Topo(Graph& g)
{
int vis[g.nodeNumber]={0},cnt=0,i,flag=1,dex;
int inDegree[g.nodeNumber]={0};
int outDegree[g.nodeNumber]={0};
CalculateDegree(g,inDegree,outDegree);
stack<int>S;
for(int i=0;i<g.nodeNumber;i++)
{
if(inDegree[i]==0)
{
S.push(i);vis[i]=1;
}
}
int sum;
int ans[g.nodeNumber]={0};
while(!S.empty())
{
i=S.top();
S.pop();
// out.push_back(i);
for(int j=0;j<g.nodeNumber;j++)
{
if(g.adjMatrix[i][j]==1&&inDegree[j]!=0)
{
inDegree[j]--;
ans[j]=max(g.weight[i][j]+ans[i],ans[j]);
g.ve[j]=ans[j];
sum=max(sum,ans[j]);
}
if(inDegree[j]==0&&!vis[j])
{
S.push(j);
vis[j]=1;
}
}
}
int vis1[g.nodeNumber]={0};
for(int i=0;i<g.nodeNumber;i++)
{
if(outDegree[i]==0)
{
S.push(i);vis1[i]=1;
}
}
int res[g.nodeNumber];
for(int i=0;i<g.nodeNumber;i++)res[i]=sum;
while(!S.empty())
{
i=S.top();
S.pop();
// out.push_back(i);
for(int j=0;j<g.nodeNumber;j++)
{
if(g.adjMatrix[j][i]==1&&outDegree[j]!=0)
{
outDegree[j]--;
res[j]=min(res[i]-g.weight[j][i],res[j]);
g.vl[j]=res[j];
// sum=min(sum,ans[i]);
}
if(outDegree[j]==0&&!vis1[j])
{
// cout<<"j="<<j<<endl;
S.push(j);
vis1[j]=1;
}
}
}
for(int i=0;i<g.nodeNumber;i++)
{
for(int j=0;j<g.nodeNumber;j++)
{
if(g.adjMatrix[i][j])
{
l[i][j]=res[j]-g.weight[i][j];
}
}
}
for(int i=0;i<m;i++)
{
//cout<<res[i]<<endl;
cout<<l[a[i]][b[i]]<<endl;
}
}
int main()
{
cin>>n;
Graph g;
g.nodeNumber=n;
cin>>m;
int inDegree[g.nodeNumber]={0};
int o=0;
int f=m;
while(f--){
cin>>u>>v>>w;
a[o]=u;b[o]=v;o++;
g.adjMatrix[u][v]=1;
g.weight[u][v]=w;
}
Topo(g);
return 0;
}
J:图-图的关键路径
·耶写完
#include<bits/stdc++.h>
#define MAX_SIZE 100
using namespace std;
vector<int> out;
int e[MAX_SIZE][MAX_SIZE],l[MAX_SIZE][MAX_SIZE];
int a[MAX_SIZE],b[MAX_SIZE];
int n,m,u,v,w,t;
struct Graph{
int nodeNumber;
int Info[MAX_SIZE];
int ve[MAX_SIZE];
int vl[MAX_SIZE];
int weight[MAX_SIZE][MAX_SIZE];
int adjMatrix[MAX_SIZE][MAX_SIZE];
};
void CalculateDegree(const Graph& g,int inDegree[],int outDegree[])
{
for(int i=0;i<g.nodeNumber;i++)
{
for(int j=0;j<g.nodeNumber;j++){
if(g.adjMatrix[i][j])
{
inDegree[j]++;
outDegree[i]++;
}
}
}
}
void Topo(Graph& g)
{
int vis[g.nodeNumber]={0},cnt=0,i,flag=1,dex;
int inDegree[g.nodeNumber]={0};
int outDegree[g.nodeNumber]={0};
CalculateDegree(g,inDegree,outDegree);
stack<int>S;
for(int i=0;i<g.nodeNumber;i++)
{
if(inDegree[i]==0)
{
S.push(i);vis[i]=1;
}
}
int sum;
int ans[g.nodeNumber]={0};
while(!S.empty())
{
i=S.top();
S.pop();
// out.push_back(i);
for(int j=0;j<g.nodeNumber;j++)
{
if(g.adjMatrix[i][j]==1&&inDegree[j]!=0)
{
inDegree[j]--;
ans[j]=max(g.weight[i][j]+ans[i],ans[j]);
g.ve[j]=ans[j];
sum=max(sum,ans[j]);
}
if(inDegree[j]==0&&!vis[j])
{
S.push(j);
vis[j]=1;
}
}
}
int vis1[g.nodeNumber]={0};
for(int i=0;i<g.nodeNumber;i++)
{
if(outDegree[i]==0)
{
S.push(i);vis1[i]=1;
}
}
int res[g.nodeNumber];
for(int i=0;i<g.nodeNumber;i++)res[i]=sum;
while(!S.empty())
{
i=S.top();
S.pop();
// out.push_back(i);
for(int j=0;j<g.nodeNumber;j++)
{
if(g.adjMatrix[j][i]==1&&outDegree[j]!=0)
{
outDegree[j]--;
res[j]=min(res[i]-g.weight[j][i],res[j]);
g.vl[j]=res[j];
// sum=min(sum,ans[i]);
}
if(outDegree[j]==0&&!vis1[j])
{
// cout<<"j="<<j<<endl;
S.push(j);
vis1[j]=1;
}
}
}
for(int i=0;i<g.nodeNumber;i++)
{
for(int j=0;j<g.nodeNumber;j++)
{
if(g.adjMatrix[i][j])
{
e[i][j]=g.ve[i];
l[i][j]=res[j]-g.weight[i][j];
// cout<<e[i][j]<<" "<<l[i][j]<<endl;
}
}
}
for(int i=0;i<m;i++)
{
//cout<<res[i]<<endl;
if(e[a[i]][b[i]]==l[a[i]][b[i]])
cout<<a[i]<<"-->"<<b[i]<<":"<<e[a[i]][b[i]]<<endl;
}
}
int main()
{
cin>>n;
Graph g;
g.nodeNumber=n;
cin>>m;
int inDegree[g.nodeNumber]={0};
int o=0;
int f=m;
while(f--){
cin>>u>>v>>w;
a[o]=u;b[o]=v;o++;
g.adjMatrix[u][v]=1;
g.weight[u][v]=w;
}
Topo(g);
return 0;
}