• --uva247(calling circles)强联通与floyd-warshell


    图论题:一开始我是用tarjan算法做的,wrong answer 了很多次,然后又用了floyd-warshell算法,也wa了

    最后找了题解,原来最后的dataset后面不是组数,是样例的编号,题根本就没说,让人怎么理解。。。

    tarjan

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<string>
    #include<map>
    #include<algorithm>
    #define M 100
    using namespace std;
    
    int qis;
    int maps[50][50];
    int dfn[M],low[M],vis[M],stacks[M];
    int belongs[25][50];
    int cnt ,scnt,begin,ans;
    
    void init(){
        memset(dfn,0,sizeof(dfn));
        memset(low,0,sizeof(low));
        memset(stacks,0,sizeof(stacks));
        memset(vis,0,sizeof(vis));
        memset(belongs,0,sizeof(belongs));
        memset(maps,0,sizeof(maps));
        qis  = cnt = scnt =  begin  = ans =0;
    }
    
    void tarjan(int x){
        int v;
        dfn[x] = low [x] = ++cnt ;
        stacks[++begin] = x;
        for(int i = 1;i<=qis;i++){
            if(maps[x][i]){
    
                if(!dfn[i]){
                    tarjan(i);
                    low[x] = min(low[x],low[i]);
                }
                else if(!vis[i]){
                    low[x] = min(low[x],dfn[i]);
                }
    
            }
        }
        if(low[x] == dfn[x]){
            scnt ++;
            do{
                v = stacks[begin--];
                belongs[scnt][++belongs[scnt][0]] = v;//顶点处理
                vis[v] = 1;
            }while(v != x);
    
            if(belongs[scnt][0]>1)ans ++;
    
        }
    }
    
    int main(){
        int flag = 1;
        int n,m;
        int cases = 1;
        while(scanf("%d%d",&n,&m),n||m){
    
            string a,b;
    
            init();
    
    
    
            map<string,int>ms;
            map<int,string>_ms;
            ms.clear();_ms.clear();
    
            for(int i = 0;i<m;i++){
    
               cin>>a>>b;
               if(ms[a] == 0)ms[a] = ++qis;
               if(ms[b] == 0)ms[b] = ++qis;
               _ms[ms[a]] = a;
               _ms[ms[b]] = b;
               maps[ms[a]][ms[b]] = 1;
    
            }
    
            for(int i  =1;i<= qis;i++){
    
                if(!dfn[i])tarjan(i);
    
            }
            if(flag == 1)flag = 0;
            else puts("");
    
            printf("Calling circles for data set %d:
    ",cases++);
            for(int i = 1;i<=scnt;i++){
                int j;
                for(j = 1;j<belongs[i][0];j++)
                   cout<<_ms[belongs[i][j]]<<", ";
                cout<<_ms[belongs[i][j]]<<endl;
            }
    
        }
    }
    

    floyd-warshell:

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<string>
    #include<map>
    #include<algorithm>
    #define M 100
    using namespace std;
    
    int qis;
    int maps[50][50];
    int vis[M];
    int belongs[25][50];
    int scnt ,ans;
    int cases = 1;
    
    
    
    int main(){
        int flag = 1;
        int n,m;
        while(scanf("%d%d",&n,&m),n||m){
            qis =ans =  scnt = 0;
            string a,b;
            map<string,int>ms;
            map<int,string>_ms;
            ms.clear();_ms.clear();
            memset(vis,0,sizeof(vis));
            memset(maps,0,sizeof(maps));
            memset(belongs,0,sizeof(belongs));
            for(int i = 1;i<=n;i++)maps[i][i] = 1;
            for(int i = 0;i<m;i++){
    
               cin>>a>>b;
               if(ms[a] == 0)ms[a] = ++qis;
               if(ms[b] == 0)ms[b] = ++qis;
               _ms[ms[a]] = a;
               _ms[ms[b]] = b;
               maps[ms[a]][ms[b]] = 1;
    
            }
    
            //floyd
    		for(int k = 1;k <= n;k++)
    		    for(int i = 1;i <= n;i++)
    			    for(int j = 1;j <= n;j++){
        				
        				maps[i][j] = maps[i][j] || (maps[i][k] && maps[k][j]);
        				
        			} 
        			
    		for(int i = 1;i<=n;i++){
    			if(vis[i] == 0){
    				scnt++;
    				for(int j = 1;j<=n;j++){
    					
    					if(maps[i][j]&&maps[j][i]){
    							belongs[scnt][++belongs[scnt][0]] = j;
    							vis[j] = 1;
    					}
    				
    					
    				}
    				if(belongs[scnt][0]>1)ans++;	
    			}
    		
    		}
            if(flag == 1)flag = 0;
            else puts("");
    
            printf("Calling circles for data set %d:
    ",cases++);
            for(int i = 1;i<=scnt;i++){
                int j;
                for(j = 1;j<belongs[i][0];j++)
                   cout<<_ms[belongs[i][j]]<<", ";
                cout<<_ms[belongs[i][j]]<<endl;
            }
    
        }
    }
    

      

  • 相关阅读:
    在知识爆炸的年代如何学习,避免成为PPT架构师
    同城双活的概念
    随笔《一个程序猿的生命周期》- 逆潮流而动的“叛逆者”
    连载《一个程序猿的生命周期》- 第1册《生存》篇全集 下载
    连载《一个程序猿的生命周期》- 44.感谢,我从事了IT相关的工作
    连载《一个程序猿的生命周期》- 43.我被这个时代淘汰了吗? ---2016年开篇,春节祝福!!!
    连载《一个程序猿的生命周期》- 42.新公司这一年,我都发生了哪些变化。--- 年底干货总结!!!
    连载《一个程序猿的生命周期》- 41.一个时代有一个时代人的使命
    【转载、推荐】不要自称是程序员,我十多年的 IT 职场总结
    [群友反馈] 程序猿身上的缺点
  • 原文地址:https://www.cnblogs.com/lovelystone/p/4737750.html
Copyright © 2020-2023  润新知