搜索
查看: 306|回复: 3

求助lyt大佬快显灵!!!!!!!!!!!!!!!!!!

[复制链接]
 楼主| 发表于 2019-1-29 17:24:40 | 显示全部楼层 |阅读模式
求作业四题题解,做出来之后就往里面发!!!!!
发表于 2019-1-29 17:25:36 | 显示全部楼层
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <vector>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7. int n,cnt,low[20009],flag[20009],num[20009],root,m,ans,gedian,book[20009],t,hahaha=0,ansx=0;
  8. long long u;
  9. vector <int> e[20009];
  10. void dfs(int cur,int father)
  11. {
  12.     int child=0,i;
  13.     cnt++;
  14.     num[cur]=cnt;
  15.     low[cur]=cnt;
  16.     for(i=0;i<e[cur].size();i++)
  17.     {
  18.         int v = e[cur][i];
  19.         if(num[v]==0)
  20.         {
  21.             child++;
  22.               
  23.             dfs(v,cur);
  24.             low[cur] = min(low[cur],low[v]);
  25.             if(cur!=root && low[v]>=num[cur])
  26.             {
  27.                 flag[cur]=1;
  28.             }
  29.             if(cur==root && child>=2)
  30.             {
  31.                 flag[cur]=1;
  32.             }
  33.         }
  34.         else
  35.         {
  36.             if(v!=father)
  37.             {
  38.                 low[cur]=min(low[cur],num[v]);
  39.             }
  40.         }
  41.     }
  42.     return;
  43. }
  44. void use(int v)
  45. {
  46.     if(book[v]==t)
  47.     {
  48.         return;
  49.     }
  50.     book[v]=t;
  51.     if(flag[v]==1)
  52.     {
  53.         gedian++;
  54.         return;
  55.     }
  56.     ans++;
  57.     for(int x=0;x<e[v].size();x++)
  58.     {
  59.         use(e[v][x]);
  60.     }
  61.     return;
  62. }
  63. int main()
  64. {
  65.     int i,j;
  66.     while(scanf("%d",&m) && m!=0)
  67.     {
  68.       
  69.         cnt=0;
  70.         memset(flag,0,sizeof(flag));
  71.         memset(book,0,sizeof(book));
  72.         memset(low,0,sizeof(low));
  73.         memset(num,0,sizeof(num));
  74.         gedian=0;
  75.         ans=0;
  76.         t=-1;
  77.         n=0;
  78.         u=1;
  79.         for(i=1;i<=m;i++)
  80.         {
  81.             int a,b;
  82.             scanf("%d%d",&a,&b);
  83.             n=max(a,n);
  84.             n=max(b,n);
  85.             e[a].push_back(b);
  86.             e[b].push_back(a);
  87.         }
  88.         for(i=1;i<=n;i++)
  89.         {
  90.             if(num[i]==0)
  91.             {
  92.                 root=i;
  93.                 dfs(root,root);
  94.             }
  95.         }
  96.         u=1;
  97.         for(i=1;i<=n;i++)
  98.         {
  99.             if(book[i]==0 && flag[i]!=1)
  100.             {
  101.                 use(i);
  102.                 t--;
  103.                 if(gedian==1)
  104.                 {
  105.                     ansx++;
  106.                     u=u*ans;
  107.                 }
  108.                 ans=0;
  109.                 gedian=0;
  110.             }
  111.         }
  112.         hahaha++;
  113.         int h;
  114.         h=n*(n-1)/2;
  115.         if(ansx==0)
  116.         {
  117.             printf("Case %d: 2 %d\n",hahaha,h);
  118.         }
  119.         else
  120.         {
  121.             printf("Case %d: %d %lld\n",hahaha,ansx,u);
  122.         }
  123.          
  124.         ansx=0;
  125.         for(i=1;i<=n;i++)
  126.         {
  127.             e[i].clear();
  128.         }
  129.     }
  130.     return 0;
  131. }
复制代码
发表于 2019-1-29 17:29:52 | 显示全部楼层
游览农场
  1. #include<cstdio>

  2. using namespace std;

  3. struct node
  4. {
  5.     int s;
  6.     int e;
  7.     int f;
  8.     int c;
  9. };

  10. struct node edge[30000];
  11. int n,m,sum,inf=999999999;
  12. int book[30000],dis[1001],father[1001];


  13. int bellman()
  14. {
  15.     int i,k;
  16.      
  17.     for(i=0;i<=n+1;i++)
  18.     {
  19.         father[i]=-1;
  20.         dis[i]=inf;
  21.     }
  22.      
  23.     dis[0]=0;
  24.     for(k=0;k<=n+1;k++)
  25.         for(i=1;i<=m;i++)
  26.         {
  27.             if(edge[i].c==0) continue;
  28.             if(dis[edge[i].e]>dis[edge[i].s]+edge[i].f)
  29.             {
  30.                 dis[edge[i].e]=dis[edge[i].s]+edge[i].f;
  31.                 father[edge[i].e]=i;
  32.             }
  33.         }
  34.     if(dis[n+1]==inf) return 0;
  35.     return 1;
  36. }

  37. void dfs()
  38. {
  39.     int u,x,i;
  40.      
  41.     while(bellman())
  42.     {
  43.         u=n+1;
  44.         while(father[u]!=-1)
  45.         {
  46.             x=father[u];
  47.             if(x<=m-4)
  48.             {
  49.                 edge[x].c=0;
  50.                 edge[book[x]].f=-1;
  51.             }
  52.             else
  53.             {
  54.                 edge[x].c-=1;
  55.                 edge[book[x]].c+=1;
  56.             }
  57.             u=edge[x].s;
  58.         }
  59.         sum+=dis[n+1];
  60.     }
  61.     return ;
  62. }
  63.                  

  64. int main()
  65. {
  66.     int i,t1,t2,t3;
  67.      
  68.     scanf("%d%d",&n,&m);
  69.     for(i=1;i<=m;i++)
  70.     {
  71.         scanf("%d%d%d",&t1,&t2,&t3);
  72.         edge[i].s=t1;
  73.         edge[i].e=t2;
  74.         edge[i].f=t3;
  75.         edge[i].c=1;
  76.         book[i]=i+m;
  77.          
  78.         edge[i+m].s=t2;
  79.         edge[i+m].e=t1;
  80.         edge[i+m].f=t3;
  81.         edge[i+m].c=1;
  82.         book[i+m]=i;
  83.     }
  84.     m=m*2;
  85.      
  86.     edge[m+1].s=0;
  87.     edge[m+1].e=1;
  88.     edge[m+1].f=0;
  89.     edge[m+1].c=2;
  90.     book[m+1]=m+2;
  91.      
  92.     edge[m+2].s=1;
  93.     edge[m+2].e=0;
  94.     edge[m+2].f=0;
  95.     edge[m+2].c=0;
  96.     book[m+2]=m+1;
  97.      
  98.     edge[m+3].s=n;
  99.     edge[m+3].e=n+1;
  100.     edge[m+3].f=0;
  101.     edge[m+3].c=2;
  102.     book[m+3]=m+4;

  103.     edge[m+4].s=n+1;
  104.     edge[m+4].e=n;
  105.     edge[m+4].f=0;
  106.     edge[m+4].c=0;
  107.     book[m+4]=m+3;
  108.      
  109.     m=m+4;
  110.      
  111.      
  112.     dfs();
  113.      
  114.     printf("%d",sum);
  115.      
  116.     return 0;
  117. }
复制代码
发表于 2019-1-30 12:01:11 | 显示全部楼层

bellman+DFS吗?做出来倒是挺妙的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表