Reward HDU - 2647(两种解法:dfs, 拓扑)

22 篇文章 0 订阅
2 篇文章 0 订阅

 //在做的时候,邻接表构造错了,导致出现死循环问题tle。。。还有就是topo里面sum写在了if外,,,,导致计数错误WA

//dfs已解出

#include<iostream>
#include<cstdio>
#include <string.h>
#include<algorithm>
#include<queue>

using namespace std;

const int N = 20000+5;

struct Edge{
    int to;
    int next;
}e[N];

int vis[N];
int price[N];
int dgree[N];
int head[N];
int sum;        
int n, m;


//构造邻接表 
void add(int x, int y, int i)
{
    e[i].to = x;//逆向
    e[i].next = head[y];
    head[y] = i;
}


void dfs(int i)
{
    for(int j=head[i]; j != -1; j=e[j].next){

        int v = e[j].to;
        dgree[v]--;
        price[v] = max(price[v], price[i]+1);//每次都会更新,有一种可能就是之前存储的比现在多,就不用更新了.... 
        if(dgree[v] == 0 && vis[v] == 0){
            vis[v] = 1;
                    sum++;

            dfs(v);
        }
    }
    return;
}




void toposort()
{
	sum = 0;
	queue<int> q;
	
	for(int i=1; i<=n; i++){
		if(dgree[i] == 0){
			q.push(i);
			vis[i] = 1;
			sum ++;
		}
	}
		
		while(!q.empty()){
			int i = q.front();
			q.pop();
			
  for(int j=head[i]; j != -1; j=e[j].next){

        int v = e[j].to;
        dgree[v]--;
        
        price[v] = price[i]+1;

        if(dgree[v] == 0 && vis[v] == 0){

        	q.push(v);
            vis[v] = 1;
                    sum++;

        }
    }
		}
	
}


    int main()
    {

        while(~scanf("%d%d", &n, &m)){

            sum = 0;//为dfs做准备 
            memset(price, 0, sizeof(price));

            memset(vis, 0, sizeof(vis));
            memset(dgree, 0, sizeof(dgree));
            memset(head, -1, sizeof(head));

            for(int i=1; i<=m; i++){
                int a, b;
				scanf("%d%d", &a, &b); 
           //     cin >> a >> b;

                add(a, b, i);
                dgree[a]++;
            }

            for(int i=1; i<=n; i++){
                if(dgree[i] == 0 && vis[i] == 0){
sum++; 
                    vis[i] = 1;
                    dfs(i);
 

                }
            }
            
   //          					toposort();

  //          cout << sum << endl;
            if(sum == n){
                sum = n*888;

                for(int i=1; i<=n; i++){
                    sum += price[i];
                }
                printf("%d\n", sum);
           //     cout << sum << endl;
            }
            else printf("-1\n");


        }

        return 0;
    }

//ps:以下问题已解决。。。。详见上图第一个代码

//个人感觉可以用dfs解下,但是目前一直WA,待解决....

#include<iostream>
#include<cstdio>
#include <string.h>
#include<algorithm>
#include<queue>

using namespace std;

const int N = 20000+5;

struct Edge{
    int to;
    int next;
}e[N];

int vis[N];
int price[N];
int dgree[N];
int head[N];
int sum;        
int n, m;


//构造邻接表 
void add(int x, int y, int i)
{
    e[i].to = x;//逆向
    e[i].next = head[y];
    head[y] = i;
}
void dfs(int i)
{
    for(int j=head[i]; j != -1; j=e[j].next){

        int v = e[j].to;
        dgree[v]--;
        price[v] = price[i]+1;
        if(dgree[v] == 0 && vis[v] == 0){
            vis[v] = 1;
                    sum++;

            dfs(v);
        }
    }
}


void toposort()
{
	sum = 0;
	queue<int> q;
	
	for(int i=1; i<=n; i++){
		if(dgree[i] == 0){
			q.push(i);
			vis[i] = 1;
			sum ++;
		}
	}
		
		while(!q.empty()){
			int i = q.front();
			q.pop();
			
  for(int j=head[i]; j != -1; j=e[j].next){

        int v = e[j].to;
        dgree[v]--;
        
        price[v] = price[i]+1;

        if(dgree[v] == 0 && vis[v] == 0){

        	q.push(v);
            vis[v] = 1;
                    sum++;

        }
    }
		}
	
}


    int main()
    {

        while(~scanf("%d%d", &n, &m)){

            sum = 1;//为dfs做准备 
            memset(price, 0, sizeof(price));

            memset(vis, 0, sizeof(vis));
            memset(dgree, 0, sizeof(dgree));
            memset(head, -1, sizeof(head));

            for(int i=1; i<=m; i++){
                int a, b;
				scanf("%d%d", &a, &b); 
           //     cin >> a >> b;

                add(a, b, i);
                dgree[a]++;
            }

            for(int i=1; i<=n; i++){
                if(dgree[i] == 0){

                    vis[i] = 0;
                    dfs(i);
 

                }
            }
            
   //          					toposort();

  //          cout << sum << endl;
            if(sum == n){
                sum = n*888;

                for(int i=1; i<=n; i++){
                    sum += price[i];
                }
                printf("%d\n", sum);
           //     cout << sum << endl;
            }
            else printf("-1\n");


        }

        return 0;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2023-06-17 23:47:22.786162: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'cudart64_110.dll'; dlerror: cudart64_110.dll not found 2023-06-17 23:47:22.786281: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine. 2023-06-17 23:47:24.419330: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'nvcuda.dll'; dlerror: nvcuda.dll not found 2023-06-17 23:47:24.419809: W tensorflow/stream_executor/cuda/cuda_driver.cc:263] failed call to cuInit: UNKNOWN ERROR (303) 2023-06-17 23:47:24.426229: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:169] retrieving CUDA diagnostic information for host: ����� 2023-06-17 23:47:24.426345: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:176] hostname: ����� 2023-06-17 23:47:24.430552: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX AVX2 To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags. Traceback (most recent call last): File "C:\Users\10290\Desktop\test\writer.py", line 20, in <module> write_reward_tb(summary_writer, rewards[i], i) File "C:\Users\10290\Desktop\test\writer.py", line 9, in write_reward_tb summary = tf.Summary(value=[tf.Summary.Value(tag='reward', simple_value=reward)]) AttributeError: module 'tensorflow' has no attribute 'Summary'分析错误原因
最新发布
06-18

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值