HDOJ2094拓扑排序

来源:互联网 发布:js canvas 动画库 编辑:程序博客网 时间:2024/05/29 19:57
<p>传送门:<a target=_blank href="http://acm.hdu.edu.cn/showproblem.php?pid=2094" target="_blank">http://acm.hdu.edu.cn/showproblem.php?pid=2094</a></p><p></p><p><pre name="code" class="cpp">/*一道形似拓扑排序的题HDOJ2094本质上考察的是对图论的理解冠军的产生:当且仅当某个点的入度为0,才可能为冠军!由此:此题的最佳做法不是建图,而是直接统计每个点的入度若只有一个节点u的入度为0,即:只可能是u为冠军最后,本题的难点归在了如何判断每个字母串(运动员名字)之前是否出现过用char或者string均可轻松完成*///下面贴代码 #include <iostream>#include <algorithm>#include <stdio.h>#include <math.h>#include <vector>#include <string>#include <cstring>#include <sstream>using namespace std;#define input freopen("input.txt","r",stdin);#define output freopen("output.txt","w",stdout);#define For1(i,a,b) for (i=a;i<b;i++)#define For2(i,a,b) for (i=a;i<=b;i++)#define Dec(i,a,b) for (i=a;i>b;i--)#define Dec2(i,a,b) for (i=a;i>=b;i--)#define Sca_d(x) scanf("%d",&x)#define Sca_s(x) scanf("%s",x)#define Sca_c(x) scanf("%c",&x)#define Sca_f(x) scanf("%f",&x)#define Sca_lf(x) scanf("%lf",&x)#define Fill(x,a) memset(x,a,sizeof(x))#define MAXN 0x7fffffff#define MAX 1000 char ch[MAX][MAX];char c[MAX];int in[MAX];int main(){//input;int n,num,i,j,k,tot;while(cin>>n){if (!n) break;Fill(in,0);tot=i=j=k=0;For2(i,1,n){int flag=1;Sca_s(c);//第一个字符串输入只需判断之前的有无 For2(j,1,k)if (strcmp(ch[j],c)==0){flag=0;break;}if (flag)k++,strcpy(ch[k],c);Sca_s(c);//第二个字符串 flag=1;For2(j,1,k)if (strcmp(ch[j],c)==0)//若之前出现过,则此点入度+1 {in[j]++;flag=0;break;}if (flag)//若之前未出现过,则先要新建一个节点,此点入度+1 k++,strcpy(ch[k],c),in[k]++;}For2(i,1,k)if (in[i]==0) tot++;if (tot==1)//当且仅当存在一个入度为0的节点 cout<<"Yes"<<endl;elsecout<<"No"<<endl;}return 0;}


                                             
0 0
原创粉丝点击