HDOJ 1285 确定比赛名次(拓扑排序)
生活随笔
收集整理的這篇文章主要介紹了
HDOJ 1285 确定比赛名次(拓扑排序)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2018-5-23
簡單的拓撲排序,我用的是優先隊列,按照字典序排序,將入度為零的點放入隊列, 則直接按照字典序排序。 需要注意的是:如果有兩個重復的數據,則相應的入度值就不應該加一了。 #include<iostream> #include<queue> #include<cstring> using namespace std;const int N = 500; bool f[N+1][N+1]; int res[N+1]; bool is[N+1]; int n,m;struct pm{int b,v;bool operator <(const pm &a) const{return b>a.b;} }x[N+1]; priority_queue<struct pm>que;void init(){memset(f,false,sizeof(f));memset(is,false,sizeof(is));for (int i=1;i<=n;i++){x[i].v=0;x[i].b=i;}que.empty(); }void show(){for (int i=1;i<n;i++){printf ("%d ",res[i]);}printf ("%d\n",res[n]); }void toposort(){int p=1;while (!que.empty()){struct pm tmp=que.top();que.pop();res[p++]=tmp.b;for (int i=1;i<=n;i++){if (f[tmp.b][i]){x[i].v--;}}for (int i=1;i<=n;i++){if (!is[i]&&!x[i].v){que.push(x[i]);is[i]=true;}}}show(); }int main(){while (scanf ("%d%d",&n,&m)!=EOF){init();for (int i=0;i<m;i++){int a,b;scanf ("%d%d",&a,&b);if (!f[a][b]) x[b].v++;f[a][b]=true;}for (int i=1;i<=n;i++){if (!x[i].v){que.push(x[i]);is[i]=true;}}toposort();}return 0; }/* 4 3 1 2 2 3 4 3 */總結
以上是生活随笔為你收集整理的HDOJ 1285 确定比赛名次(拓扑排序)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 权限问题导致zabbix无法监控mysq
- 下一篇: c++ winpcap开发(3)