| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
我用的是map+欧拉通路 ,这是我的代码,为什么会runtime error?#include<iostream>
#include<string>
#include<map>
using namespace std;
int data[50][50]; //记录两个数字之间是否有边
int visited[50]; //深搜时标记是否被遍历
int out[50]; //每个数字出度的个数
int in[50]; //每个数字入度的个数
int n=1; //数字的个数
void dfs(int now)
{ //从now结点开始进行深搜
visited[now]=1;
for(int i=1; i<=n; ++i)
{
if(data[now][i] && !visited[i])
{ //有边,未遍历
dfs(i);
}
}
}
bool connected(int now)
{ //是否输入的点是单向联通
memset(visited, 0, sizeof(visited));
dfs(now);
for(int i=1; i<=n; ++i)
{
if(!visited[i] && (in[i]>0||out[i]>0))
{ //必须保证该点确实存在
return false;
}
}
return true;
}
int main()
{
// freopen("in.txt", "r", stdin);
string str1, str2; //记录输入的字符串
map<string, int> m;
while(cin>>str1>>str2)
{
if(m[str1]==0)
{
m[str1]=n;
n++;
}
if(m[str2]==0)
{
m[str2]=n;
n++;
}
data[m[str1]][m[str2]]++;
out[m[str1]]++;
in[m[str2]]++;
}
int in_num=0; //入度大于出度的元素的个数
int out_num=0; //出度大于入度的元素的个数
int out_loc=m[str1];//记录出度大于入度的结点,它的初值不能随意取,必须保证该点存在
bool flag=0; //标记能否成功
for(int i=1; i<=n; ++i)
{
if(out[i]-in[i]<-1||out[i]-in[i]>1)
{
flag=1; //标记失败
break;
}
if(out[i]>in[i])
{
out_num++;
out_loc=i; //记录遍历的初值
}
if(out[i]<in[i])
{
in_num++;
}
}
if(flag||out_num>1||in_num>1||out_num!=in_num||!connected(out_loc))
{
cout<<"Impossible"<<endl;
}else{
cout<<"Possible"<<endl;
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator