码迷,mamicode.com
首页 > 编程语言 > 详细

hdu-2647 Reward && hdu-2049产生冠军 &&hdu-3342Legal or Not(拓扑排序)

时间:2016-04-20 13:04:35      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

hdu-2647

/*Problem : 2647 ( Reward )     Judge Status : Accepted
RunId : 16919085    Language : G++    Author : 2014300227
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta*/
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+6;
typedef long long ll;
const ll mod=1e9+7;
int n,m,ind[N],u,v,vis[N];
vector<int>ve[N];
struct node
{
    int num,pri;
};
node temp;
queue<node>qu;
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        ll ans=0;
        for(int i=1;i<=n;i++)
        {
            ve[i].clear();
            vis[i]=ind[i]=0;
        }
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&u,&v);
            ve[v].push_back(u);
            ind[u]++;
        }
        for(int i=1;i<=n;i++)
        {
            if(!ind[i])
            {
                temp.num=i;
                temp.pri=888;
                qu.push(temp);
            }
        }
        int cnt=n;
        while(!qu.empty())
        {
            node fr=qu.front();
            ans+=(ll)fr.pri;
            qu.pop();
            cnt--;
            int len=ve[fr.num].size();
            for(int i=0;i<len;i++)
            {
                int y=ve[fr.num][i];
                ind[y]--;
                if(ind[y]==0)
                {
                    temp.num=y;
                    temp.pri=fr.pri+1;
                    qu.push(temp);
                }
            }
        }
        if(cnt==0)printf("%lld\n",ans);
        else printf("-1\n");
    }
    return 0;
}

 

 

 

hdu-2049

/*Problem : 2094 ( 产生冠军 )     Judge Status : Accepted
RunId : 16919272    Language : G++    Author : 2014300227
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta*/
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+6;
typedef long long ll;
const ll mod=1e9+7;
int n,ind[N];
map<string,int>mp;
vector<int>ve[N];
string str1[N],str2[N];
int main()
{
    while(1)
    {
        scanf("%d",&n);
        if(n==0)break;
        for(int i=1;i<=n;i++)
        {
            ve[i].clear();
            ind[i]=0;
        }
        int cnt=1;
        for(int i=0;i<n;i++)
        {
            cin>>str1[i]>>str2[i];
            if(mp[str1[i]]==0)mp[str1[i]]=cnt++;
            if(mp[str2[i]]==0)mp[str2[i]]=cnt++;
            int u=mp[str1[i]],v=mp[str2[i]];
            ve[u].push_back(v);
            ind[v]++;
        }
        int num=0;
        for(int i=1;i<cnt;i++)
        {
            if(!ind[i])
            {
                num++;
            }
        }
        if(num!=1)printf("No\n");
        else printf("Yes\n");
        for(int i=0;i<n;i++)
        {
            mp[str1[i]]=0;
            mp[str2[i]]=0;
        }

    }
    return 0;
}

 

hdu-3342

 

/*Problem : 2647 ( Reward )     Judge Status : Accepted
RunId : 16919085    Language : G++    Author : 2014300227
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta*/
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+6;
typedef long long ll;
const ll mod=1e9+7;
int n,m,ind[N],u,v,vis[N];
vector<int>ve[N];
struct node
{
    int num,pri;
};
node temp;
queue<node>qu;
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        ll ans=0;
        for(int i=1;i<=n;i++)
        {
            ve[i].clear();
            vis[i]=ind[i]=0;
        }
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&u,&v);
            ve[v].push_back(u);
            ind[u]++;
        }
        for(int i=1;i<=n;i++)
        {
            if(!ind[i])
            {
                temp.num=i;
                temp.pri=888;
                qu.push(temp);
            }
        }
        int cnt=n;
        while(!qu.empty())
        {
            node fr=qu.front();
            ans+=(ll)fr.pri;
            qu.pop();
            cnt--;
            int len=ve[fr.num].size();
            for(int i=0;i<len;i++)
            {
                int y=ve[fr.num][i];
                ind[y]--;
                if(ind[y]==0)
                {
                    temp.num=y;
                    temp.pri=fr.pri+1;
                    qu.push(temp);
                }
            }
        }
        if(cnt==0)printf("%lld\n",ans);
        else printf("-1\n");
    }
    return 0;
}

 

hdu-2647 Reward && hdu-2049产生冠军 &&hdu-3342Legal or Not(拓扑排序)

标签:

原文地址:http://www.cnblogs.com/zhangchengc919/p/5411988.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!