2066 三角恋
2066 三角戀
?
?時(shí)間限制: 1 s ?空間限制: 128000 KB ?題目等級(jí) : 鉆石 Diamond 題解 ?查看運(yùn)行結(jié)果 題目描述?Description人們的戀愛(ài)關(guān)系與如下特點(diǎn):兩個(gè)人a,b,如果a愛(ài)著b,那么b一定不愛(ài)a;如果a不愛(ài)b,那么b一定愛(ài)著a(yh的研究成果果然與眾不同……)。
現(xiàn)在,yh想知道,在n個(gè)人當(dāng)中,是否存在三角戀現(xiàn)象(即a愛(ài)著b,b愛(ài)著c,c愛(ài)著a)。
輸入描述?Input Description本題有多組測(cè)試數(shù)據(jù)
第一行一個(gè)整數(shù)t,表示有t組測(cè)試數(shù)據(jù)。
對(duì)于每組數(shù)據(jù),第一行為一個(gè)整數(shù)n,表示共有n人。
接下來(lái)為n*n的0,1矩陣a,如果a[i,j]=1,則i愛(ài)著j,否則表示i不愛(ài)j;數(shù)據(jù)保證a[i,j]<>a[j,i]。
輸出描述?Output Description每組數(shù)據(jù)輸出一行,如果存在三角戀,輸出’Yes’,否則輸出’No’。
樣例輸入?Sample Input2
5
00100
10000
01001
11101
11000
5
01111
00000
01000
01100
01110
樣例輸出?Sample OutputYes
No
數(shù)據(jù)范圍及提示?Data Size & Hint對(duì)于40%的數(shù)據(jù),n≤10
對(duì)于100%的數(shù)據(jù),n≤2000,?t≤5
?
tarjan算法
#include<cstdio> #include<iostream> #include<stack> #include<vector> #include<cstring> #define M 2016 using namespace std; vector<int> grap[M]; stack<int> s; char ch[M]; int low[M],num[M],vis[M],instack[M],map[M][M],f[M],n,cnt,tot; void tarjan(int v) {low[v]=num[v]=++tot;s.push(v);instack[v]=1;vis[v]=1;for(int i=0;i<grap[v].size();i++){int w=grap[v][i];if(!vis[w]){tarjan(w);low[v]=min(low[v],low[w]);}else if(instack[w])low[v]=min(low[v],num[w]);}int u;if(low[v]==num[v]){++cnt;do{u=s.top();f[cnt]++;s.pop();instack[u]=0;}while(u!=v);} } void init(){int x;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s",ch);for(int j=1;j<=n;j++)map[i][j]=(int)ch[j-1]-'0';}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(map[i][j]==1)grap[j].push_back(i);for(int i=1;i<=n;i++)if(!vis[i])tarjan(i);if(cnt<n)printf("Yes\n");else printf("No\n");for(int i=1;i<=n;i++)grap[i].clear(); } int main(){int t;scanf("%d",&t);for(int i=1;i<=t;i++){cnt=0;memset(vis,0,sizeof(vis));memset(low,0,sizeof(low));memset(num,0,sizeof(num));memset(instack,0,sizeof(instack));memset(f,0,sizeof(f));init();}return 0; }?
?
轉(zhuǎn)載于:https://www.cnblogs.com/shenben/p/5540556.html
總結(jié)
- 上一篇: hibernate 中id生成策略
- 下一篇: jquery模糊查询