当前位置: 代码迷 >> 综合 >> 【拓扑排序】:hdu1285+hdu3342+hdu2647
  详细解决方案

【拓扑排序】:hdu1285+hdu3342+hdu2647

热度:90   发布时间:2023-11-01 07:18:07.0

hdu1285

注意题目说排名可能不是唯一的,此时要求先输出时编号小的队伍。

\\hdu1285
#include<bits/stdc++.h>
using namespace std;
int a[505][505];
int in[505];
int n,m;
int main()
{while(cin>>n>>m){memset(a,0,sizeof(a));memset(in,0,sizeof(in));while(m--){int x,y;cin>>x>>y;if(a[x][y]==0)in[y]++;a[x][y]=1;}queue<int>x;int show=0;for(int i=1;i<=n;i++){if(in[i]==0){x.push(i);in[i]=-1;break;}}while(x.size()){int y=x.front();x.pop();if(show)cout<<' ';else show++;cout<<y;for(int i=1;i<=n;i++){if(a[y][i]){in[i]--;a[y][i]=0;}}for(int i=1;i<=n;i++){if(in[i]==0){x.push(i);in[i]=-1;break;}}}cout<<endl;}
}


hdu 3342

判断所给关系有没有环

//hdu3342
#include <bits/stdc++.h>
using namespace std;
int a[105][105];
int in[105];
int show[105];
queue<int>x;
int main()
{int n,m;while(true){while(!x.empty()) x.pop();scanf("%d%d",&n,&m);if(n==0&&m==0)break;memset(a,0,sizeof(a));memset(in,0,sizeof(in));memset(show,0,sizeof(show));while(m--){int x,y;scanf("%d%d",&x,&y);if(a[x][y]) continue;a[x][y]=1;in[y]++;}int t=0;for(int i=0;i<n;i++){if(in[i]==0){x.push(i);show[i]=1;t++;}}while(!x.empty()){int u=x.front();x.pop();for(int i=0;i<n;++i){if(a[u][i]&&show[i]==0){in[i]--;if(in[i]==0){show[i]=1;t++;x.push(i);}}}}cout<<(t==n?"YES":"NO")<<endl;}
}


hdu2647

反向建图,邻接矩阵会超内存。

//hdu2647
#include <bits/stdc++.h>
using namespace std;
queue<int>x;
int show[10005];
int in[10005];
int n,m;
vector<int>g[10005];
int main()
{while(cin>>n>>m){while(x.size())x.pop();for(int i=1;i<=n;++i) g[i].clear();memset(show,0,sizeof(show));memset(in,0,sizeof(in));int sum=888;while(m--){int t1,t2;cin>>t2>>t1;g[t1].push_back(t2);in[t2]++;}for(int i=1;i<=n;i++){if(in[i]==0){x.push(i);show[i]=sum;}}sum++;int t=0;while(x.size()){int y=x.front();x.pop();t++;for(int i=0;i<g[y].size();i++){int v=g[y][i];in[v]--;if(in[v]==0){x.push(v);show[v]=max(show[v],show[y]+1);}}}if(t<n)cout<<-1<<endl;else{int s=0;for(int i=1;i<=n;i++)s=s+show[i];cout<<s<<endl;}//cout<<"----"<<endl;}
}